x64 应用程序可以使用 x86 程序集吗?反之亦然?
Posted
技术标签:
【中文标题】x64 应用程序可以使用 x86 程序集吗?反之亦然?【英文标题】:Can an x64 application use x86 assemblies - and vice versa? 【发布时间】:2011-02-11 12:47:21 【问题描述】:我的应用程序是作为 x64 应用程序构建的。迁移到 VS2010 后,我得到了 some problems,这似乎与引用的 dll 中的某些 x64/x86 不匹配有关。现在我正在转向 .NET4,我得到了更多 similar problems。
我的问题是:在混合 x64 和 x86 时我需要采取哪些预防措施。可以做到吗?我认为 x64 应用程序应该能够毫无问题地使用 x86 dll。不?另一种方式呢? x86 应用程序可以引用 x64 dll - 只要它在 x64 平台上运行?我需要注意哪些陷阱?
【问题讨论】:
【参考方案1】:您可以使用 WOW32 仿真在 64 位操作系统上运行 x86 应用程序。我遇到的一些陷阱——你不能在同一个过程中混合和匹配 32/64。因此,如果您打算以 64 位运行 IIS,则所有程序集都必须为 64 位,否则您必须在 32 位模式下运行。 64 位比其他应用程序更能帮助某些应用程序。运行 SQL 服务器的 64 位版本比 32 位版本有几个优点,最大的优点是你可以在目标服务器上安装超过 4 GB 的内存,并且 SQL 将能够使用超过 4 GB 的内存。它对 IIS 没有多大好处,因为 IIS 通常不能使用超过 3 GB 的内存。我的建议是尽可能确保您的 SQL server/os/version 为 64。它不会做一个。如果其他服务器是 64 位,则存在巨大差异,但通常更容易使用并找到 32 位版本。
【讨论】:
不是我问的,但还是有用的。谢谢!【参考方案2】:不,64 位进程只能加载 64 位 DLL,而 32 位进程只能加载 32 位 DLL。您可能想到的是 64 位 操作系统 可以运行 32 位 进程。
.NET 的主要问题是 - 在 VS2010 之前 - 可执行项目默认为“AnyCPU”,这意味着它将以其运行的操作系统的“本机”格式加载(因此 32 位版本适用于 32 位版本的 Windows 和 64 位的 Windows 的 64 位版本)。问题在于,如果您在 32 位 Windows 上测试您的应用程序(比如说),那么如果您加载 32 位 DLL 并尝试在 64 位 Windows 上运行,它可能会中断。
在 VS2010 中,他们默认所有可执行项目为“x86”(即 32 位),这(大部分)缓解了问题。
【讨论】:
这很清楚!谢谢!是的 - 我知道 64 位操作系统可以运行 32 位进程。我只是假设在流程中应用了相同的原则。让我们看看我是否可以修复我的代码,因为我知道了这一点。我想我会将所有内容都更改为 x86 ..以上是关于x64 应用程序可以使用 x86 程序集吗?反之亦然?的主要内容,如果未能解决你的问题,请参考以下文章
如何知道在构建中使用哪个 cpu(x86 x64 或 AnyCpu)?
跨平台程序集 ((x64 || x86) && (Microsoft x64 || SystemV))