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

时间:2009-12-11 04:57:25

标签: .net dll linker shared-libraries

我正在编译面向x86-64的.NET应用程序;但是,该应用程序引用了一个32位的dll。可执行文件编译正常,但Visual Studio会发出警告:

  

引用的'path / to / dll'指向与应用程序不同的处理器。

现在,我的理解是您不能简单地将64位可执行文件链接到32位共享库。 .NET(或Windows?)使用什么黑魔法来实现这一目标?

当针对x86和x86-64构建应用程序时,我注意到了相当大的内存占用差异。当动态加载32位dll并开始处理时,64位应用程序的内存占用量将大约增加60 MB(64位为250 MB,而32位为190 MB),而应用程序的内存占用量为32比特应用程序。但是,当dll中的某个代码路径被命中时,这种差异才会很大,但不幸的是,我无法查看dll以查看内部结构。

如何将64位二进制文​​件链接到32位共享库? 32位ABI不会阻止这种情况吗?

为什么在将应用程序编译为x86-64架构时,内存占用量会有如此大的差异?

任何其他要解释的信息都将不胜感激。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

  

.NET(或Windows?)使用什么黑魔法来实现这一目标?

我的理解是它没有。要引用32位dll,您需要在构建时将目标平台设置为AnyCPU或x86而不是x64。

如果您在64位版本的Windows上查看%WINDIR%\ Microsoft.NET,您将在Framework和Framework64下找到2个运行时,Framework64从2.0开始,首先支持它。

经过多挖掘,这里有一个similar question

  

为什么在将应用程序编译为x86-64架构时,内存占用量会有如此大的差异?

罗伯特是......错误是正确的(他删除了他的答案:),更多信息感谢Hanselman,但有other costs too。从我在决定我们的方法时发现的情况来看*大多数人似乎都报告了大约20-40%的内存使用量增加。

*我们的目标是针对.NET的AnyCPU,然后针对x86编译一次Wix(MSI部署),针对x64编译一次。