0

我需要构建一个能够在运行时加载其他 DLL 的 DLL;这些其他 DLL 与主 DLL(这是 Python 和扩展)具有相当密切的关系,因此它们必须具有公共运行时。主 DLL必须是可以简单地复制到目标机器上的单个文件。辅助 DLL 将放置在不同的目录中。

所以:“通用运行时”意味着没有静态链接;“单个文件 + 简单副本”排除了共享的 MS 可再发行文件,尤其是与“不同目录”结合使用时。

我只看到以下选项:将所有 DLL 链接到msvcrt.dll; 将 current 嵌入msvcrtXX到主 DLL 中并重新导出其所有符号;使用msvcrtXX主机应用程序的。对我来说,第一个看起来最简单,因为它是一种常见的需求,并且有很多网页解释了如何去做。你会如何处理这个问题?

4

2 回答 2

2

我建议您重新架构,以便您的插件 DLL(主机应用程序显式加载的那个)只包含代理函数和文件管理逻辑。此 DLL 可以使用静态运行时,或根本不使用运行时。

将实际功能(尤其是所有需要与 Python 扩展共享运行时的代码)放在单独的(“主”)DLL 中,并将此 DLL 以及您选择的运行时放在与Python 扩展。

主 DLL 和运行时可以与核心扩展一起压缩到插件 DLL。(我认为这在运行时的可再发行许可范围内,因为它与大多数安装程序的工作方式基本相同,但您应该自己检查。)

由于必须通过代理 DLL,因此对插件的调用效率会稍低一些,但性能差异可能无法测量。:-)

于 2012-05-16T07:00:57.387 回答
0

另一种选择(在我看来,更好)是动态链接 - 也就是。LoadLibrary/GetProcAddress) main 启动时的依赖项。这将允许您支持缺少 DLL 的情况和/或支持您自己的内部版本方案。

于 2012-05-15T12:50:15.903 回答