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

将32位库链接到64位.NET应用程序和内存消耗,.net,dll,linker,shared-libraries,.net,Dll,Linker,Shared Libraries,我正在编译一个针对x86-64的.NET应用程序;但是,应用程序引用32位dll。可执行文件编译良好,但Visual Studio会抛出一条警告: 引用的assemply“path/to/dll”的目标处理器与应用程序不同 现在,我的理解是,不能简单地将64位可执行文件链接到32位共享库。NET(或Windows?)使用什么黑魔法来实现这一点 我注意到,当针对x86和x86-64构建应用程序时,内存占用有很大的不同。当动态加载32位dll并开始处理时,64位应用程序的内存占用将比作为32位应用程

我正在编译一个针对x86-64的.NET应用程序;但是,应用程序引用32位dll。可执行文件编译良好,但Visual Studio会抛出一条警告:

引用的assemply“path/to/dll”的目标处理器与应用程序不同

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

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

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

当应用程序被编译为x86-64体系结构时,为什么内存占用会有如此大的差异


如需了解任何其他信息以解释此问题,将不胜感激。

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

还要注意,在64位Windows上,System32中的DLL是64位的。32位的在SysWOW64中

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

我的理解是,事实并非如此。要引用32位dll,在构建时需要将目标平台设置为AnyCPU或x86,而不是x64

如果您在64位版本的windows上查看%WINDIR%\Microsoft.NET下的内容,您会发现在Framework和Framework64下有2个运行时,Framework64从2.0开始,它是第一个受支持的版本

再挖一点,这里有一个

当应用程序被编译为x86-64体系结构时,为什么内存占用会有如此大的差异

Robert是…err是正确的(他删除了他的答案:),多亏了更多信息,但还有。从我在决定我们的方法时发现的情况来看,大多数人似乎报告内存使用量增加了20-40%


*我们最终针对.NET的任何CPU,然后针对针对针对x86和x64编译一次的Wix(MSI部署)。

是的!GAC中有一个64位版本。这就解释了建筑是如何可能的我假设如果链接的程序集不起作用,VisualStudio构建过程会在GAC中搜索引用程序集的适当版本。对吗?