C++ 如何使用visual studio构建可替换DLL?

C++ 如何使用visual studio构建可替换DLL?,c++,visual-studio,dll,compatibility,C++,Visual Studio,Dll,Compatibility,我想将游戏的某些扩展构建到一个DLL中,这样我就可以重新编译扩展并替换DLL,而无需重建整个游戏。我该怎么做呢 我在某处读到,DLL的每个新版本都必须与旧版本“二进制兼容”。只要我不更改函数名,默认情况下使用visual studio二进制编译的DLL是否兼容?您需要做的不仅仅是保持函数名不变。您必须确保的是所谓的应用程序二进制接口(ABI)兼容性 除了符号名,这还需要很多东西。例如,您可以做一些事情,例如保持跨DLL边界传递的数据结构的大小相同,并且编译器必须将模块中定义但在模块外部访问的任何

我想将游戏的某些扩展构建到一个DLL中,这样我就可以重新编译扩展并替换DLL,而无需重建整个游戏。我该怎么做呢


我在某处读到,DLL的每个新版本都必须与旧版本“二进制兼容”。只要我不更改函数名,默认情况下使用visual studio二进制编译的DLL是否兼容?

您需要做的不仅仅是保持函数名不变。您必须确保的是所谓的应用程序二进制接口(ABI)兼容性

除了符号名,这还需要很多东西。例如,您可以做一些事情,例如保持跨DLL边界传递的数据结构的大小相同,并且编译器必须将模块中定义但在模块外部访问的任何类成员放置在相同的相对位置。这在很大程度上取决于编译器的ABI。Microsoft编译器有一个坏习惯,即不同版本之间不兼容ABI,而其他一些编译器则更努力地实现兼容。但请记住,它需要的不仅仅是使用同一个编译器


您可能需要阅读有关在您的环境中维护ABI兼容性的内容,因为它可能涉及比此处列出的更多的细节,并且有很多方法会出错。给你。MSVC编译器可能有更好的版本。

如果您从DLL中导出类,那么如果更改编译器的版本,将破坏兼容性。为了解决这个问题,请这样做

使类接口像:

class EXPORT_IMPORT_MACROS IMyApi{
public:
 virtual void doSomething( IOtherApi* api ) = 0;
 virtual void doSomething2( IOtherApi2* api ) = 0;
};

并从dll中导出它们。它将为您提供独立于dll实现且可导出的头文件,这意味着它不会对不同版本的运行库产生任何问题。您还可以看看COM技术。

一种方法是重新编译DLL。只要编译器(Visual Studio)的版本不变,DLL是兼容的。否则,您必须检查手册中的Visual Studio版本之间的兼容性

另一种方法是通过使用动态加载dll,然后使用检索要调用的函数的地址


如果使用后者,则可以使用任何编译器,只要使用dllimport并将其导入即可。更多详细信息。

如果使用DLL的代码是使用相同版本的Visual Studio编译的,则是。并且使用相同的.net framework。在.netFW的3.5版本中编译的dll不能与在.netFW的2.0版本中编译的应用程序一起使用。您可以安装Visual Studio 2008和2005,并且可以使用从Visual Studio 2010安装的VS 2008或2005编译器。@Nick您是否想过通过动态脚本(如使用lua)来扩展游戏,ruby还是python?然后,您可以完全避开编译DLL的问题。这是微软试图解决各种ABI问题的一种方式。它还允许您从其他语言或跨计算机调用DLL。