【问题标题】:Linking 32-bit libraries to a 64-bit .NET application and memory consumption将 32 位库链接到 64 位 .NET 应用程序和内存消耗
【发布时间】:2009-12-11 04:57:24
【问题描述】:

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

引用的组件 'path/to/dll' 针对与应用程序不同的处理器。

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

当应用程序针对 x86 和 x86-64 构建时,我注意到内存占用量存在相当大的差异。当 32 位 dll 被动态加载并开始处理时,64 位应用程序的内存占用量将比应用程序构建为 32位应用程序。只有当 dll 中的某个代码路径被命中时,这种差异才会如此之大,但是不幸的是,我无法查看 dll 来查看内部结构。

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

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

任何其他信息来解释这一点将不胜感激。

【问题讨论】:

    标签: .net dll linker shared-libraries


    【解决方案1】:

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

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

    【讨论】:

    • 是的! GAC 中有一个 64 位版本。这可以解释如何建造。 :) 我假设如果链接的程序集不起作用,Visual Studio 构建过程会在 GAC 中搜索引用程序集的适当版本。对吗?
    【解决方案2】:

    .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%。

    * 我们最终将 AnyCPU 定位为 .NET,然后为 Wix(MSI 部署)编译了一次用于 x86 和一次用于 x64。

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 2020-02-12
      • 2019-07-06
      • 2014-09-24
      • 1970-01-01
      • 2015-05-06
      • 2011-10-27
      • 2014-04-27
      • 2012-01-02
      相关资源
      最近更新 更多