我需要构建一个能够在运行时加载其他DLL的DLL;这些其他DLL与主DLL(这是Python和扩展)具有相当亲密的关系,因此它们必须具有公共运行时。主DLL 必须是一个可以在目标机器上简单复制的文件。辅助DLL将放在不同的目录中。
所以:“common runtime”意味着没有静态链接; “单个文件+简单复制”排除了共享的MS可再发行组件,尤其是当与“不同目录”结合使用时。
我只看到以下选项:将所有DLL链接到msvcrt.dll
;将当前msvcrtXX
嵌入主DLL并重新导出其所有符号;使用主机应用程序的msvcrtXX
。对我来说,第一个看起来最简单,因为这是一个共同的需求,有很多网页解释如何去做。你会怎么做到这一点?
答案 0 :(得分:2)
我建议你重新架构,以便你的插件DLL(主机应用程序显式加载的DLL)只包含代理功能和文件管理逻辑。这个DLL可以使用静态运行时,或者根本不使用运行时。
将实际功能(特别是需要与Python扩展共享运行时的所有代码)放在一个单独的(“主”)DLL中,并将此DLL以及您选择的运行时放在同一个DLL中目录作为Python扩展。
主DLL和运行时可以与核心扩展一起压缩到插件DLL中。 (我推测这属于运行时可再发行许可证的范围,因为它与大多数安装程序的工作方式基本相同,但您应该自行检查。)
对插件的调用效率会稍微低一些,因为它们必须通过代理DLL,但性能差异可能无法衡量。 : - )
答案 1 :(得分:0)
另一种选择(以我的拙见,更好)将动态链接 - 又名。 LoadLibrary / GetProcAddress)主要启动时的依赖关系。这将允许您支持丢失DLL的情况和/或支持您自己的内部版本方案。