静态和动态链接使用不同版本的Visual Studio生成的DLL

时间:2009-06-15 13:41:44

标签: visual-studio-2008 linker

这是我正在寻求反馈的情况:

  1. 在工作中,我的职责之一是维护一些遗留应用程序,其中一个我们称之为“LegacyApp”。它始终使用VS 6.0编译。 (现在并没有太多感动。)
  2. 它使用API​​提供对某些专用硬件的访问。此API由我公司的另一个小组制作。我们将此API称为“ControllerAPI”。它始终使用VS 6.0编译。
  3. LegacyApp的开发人员还围绕ControllerAPI编写了一个包装器DLL,LegacyApp将使用它。我们称之为“WrapperAPI”。我有责任维持这个。它始终使用VS 6.0编译。
  4. WrapperAPI与ControllerAPI静态链接。
  5. LegacyApp动态对抗WrapperAPI。
  6. 在他们的下一个版本中,使用ControllerAPI的组已经开始用VS 2008编译它,而不是VS 6.0,就像他们的情况一样。
  7. 所以,这是我的问题:

    1. 由于WrapperAPI与ControllerAPI静态链接,我需要使用VS 2008编译WrapperApi吗?那是对的吗? (我已经这样做了,在这种情况下是一个简单的步骤。)
    2. 由于LegacyApp与WrapperAPI动态链接,我可以继续在VS 6.0中编译LegacyApp吗?如果是这样,我在WrapperAPI编译中是否需要做任何事情以确保仍然如此。或者我是否需要在VS 2008中编译遗留应用程序,我现在不必这样做。
    3. 因此,我的问题归结为使用不同版本的Visual Studio编译的彼此运行的应用程序和Dll,以及如果各个层静态或动态链接,它是否会有所不同。

      感谢您的反馈

1 个答案:

答案 0 :(得分:2)

如果从ControllerAPI和WrapperAPI导出的函数的签名没有改变,那么绑定应该是精细的,静态的或动态的。

但是,如果函数使用的类型和对象(输入,输出,返回参数)依赖于外部库;那么你可能会有问题。

例如,假设ControllerAPI使用一个版本的C运行时分配内存,并且WrapperAPI希望能够自己释放它 - 那么在这种情况下它们都需要链接到相同版本的C运行时。如果您在VS2008中重新创建项目而不是导入和升级它,那么您的默认编译目标和导入的库可能已更改。在使用MFC,ATL等已知类型创建的库中可以观察到类似的问题。

不幸的是,您需要手动检查这些情况,但如果您可以检查以下项目,那么您应该没问题。我还应该注意,在Visual Studio的任何两个给定版本之间以及针对不同编译目标或Platform SDK版本的任何两个版本之间也会检查这些内容。

  1. 在任何情况下,任何一个DLL都不需要知道其他DLL链接的引用(内存/句柄/资源分配)。但是,如果WrapperAPI从ControllerAPI中计算项目并适当地处理它们(例如,ControllerAPI分配了一些内容,WrapperAPI使用它,然后将其交还给ControllerAPI以进行发布/销毁),这是可以的。
  2. 两个DLL使用的结构没有内存对齐差异。
  3. 未定义参数类型的更改。注意一个版本声明一个32位类型的变量的情况,但在VS2008中重新编译可能在某些编译目标(LONG)下为64位。
  4. 导出/导入的DLL函数和任何函数参数类型的调用约定(cdecl / pascal / etc.)没有变化。