gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:27:01 31 4
gpt4 key购买 nike

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

  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。

所以,这是我的问题:

  1. 由于 WrapperAPI 是静态链接到 ControllerAPI 的,我需要用 VS 2008 编译 WrapperApi 吗?那是对的吗? (我已经这样做了,在这种情况下是一个简单的步骤。)
  2. 由于 LegacyApp 是针对 WrapperAPI 动态链接的,我可以继续在 VS 6.0 中编译 LegacyApp 吗?如果是这样,我需要在我的 WrapperAPI 编译中做些什么来确保情况仍然如此。或者我是否需要在 VS 2008 中编译遗留应用程序,我现在不想这样做。

因此,我的问题归结为相互运行使用不同版本的 Visual Studio 编译的应用程序和 Dll,以及静态或动态链接各个层是否会有所不同。

感谢任何反馈

最佳答案

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

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

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

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

  1. 在任何情况下,任何一个 DLL 都需要知道另一个 DLL 链接的引用(内存/句柄/资源分配)。但是,如果 WrapperAPI 考虑来自 ControllerAPI 的项目并适本地处理它们是可以的(例如,ControllerAPI 分配一些东西,WrapperAPI 使用它,然后将它交还给 ControllerAPI 以进行释放/销毁)。
  2. 两个 DLL 使用的结构在内存对齐方面没有差异。
  3. 定义的参数类型没有变化。注意以下情况:一个版本声明了一个 32 位类型的变量,但在 VS2008 中重新编译时在某些编译目标下可能是 64 位 (LONG)。
  4. 导出/导入的 DLL 函数和任何函数参数类型的调用约定(cdecl/pascal 等)没有变化。

关于visual-studio-2008 - 静态和动态链接使用不同版本的 Visual Studio 生成的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/996175/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com