将32位库链接到64位.NET应用程序及内存消耗

3
我正在编译一款针对x86-64的.NET应用程序; 然而,该应用程序引用了一个32位dll。可执行文件编译正常,但Visual Studio会抛出一个警告:
“所引用的程序集'path/to/dll'面向的处理器与应用程序不同。”
目前我的理解是,你无法简单地将64位可执行文件链接到32位共享库。.NET(或Windows?)使用了什么黑科技来实现这一点呢?
当应用程序构建为x86和x86-64时,内存占用有显著差异。当32位dll被动态加载并开始处理时,64位应用程序的内存占用量将比32位应用程序大约60 MB(64位为250MB,32位为190MB)。 但是,只有在命中dll中的某个代码路径时才会产生这样巨大的差异,我不能查看dll的内部情况。究竟如何使64位二进制文件连接到32位共享库?32位ABI是否阻止了这种操作?
为什么在将应用程序编译为x86-64体系结构时会有如此大的内存占用差异?
如果有其他信息可以解释这一点,将不胜感激。
2个回答

5

x86和x64无法加载到同一进程中。您确定引用不是AnyCPU程序集,或者32位引用在GAC中没有64位或AnyCPU版本吗?

另请注意,在64位Windows上,System32中的DLL是64位的。32位的DLL在SysWOW64文件夹中。


是的! GAC 中有一个 64 位版本。这就解释了构建是如何可能的。 :)我假设 Visual Studio 构建过程会搜索 GAC,以查找适合的引用程序集版本,如果链接的程序集无法工作。这正确吗? - Jim

0
.NET(或Windows)使用了什么黑魔法来完成这个任务?
我的理解是它没有。要引用32位dll,您需要在构建时将目标平台设置为AnyCPU或x86而不是x64。
如果您在64位Windows版本下查看%WINDIR%\Microsoft.NET,您会发现Framework和Framework64下有2个运行时,其中Framework64从2.0开始支持。
经过更深入的挖掘,这里有一个类似的问题链接。
为什么以x86-64架构编译应用程序时内存占用量会有如此大的差异?

Robert是...嗯,他是正确的(他删除了他的答案:),感谢Hanselman提供的更多信息,但也有其他成本。根据我在决定我们的方法时发现的情况,大多数人似乎报告内存使用量增加了20-40%。

* 我们最终针对.NET选择了AnyCPU,然后针对Wix(MSI部署)分别编译了x86和x64。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接