c# - 处理器架构问题(x86 与任何 cpu)

标签 c# .net x86 cpu-architecture

我有一个为 x86 构建的库。在引用程序集的“任何 cpu”中编译 .net 项目时,我收到以下编译器警告:

"There was a mismatch between the processor architecture of the project being built "MSIL" and
the processor architecture of the reference "xxx", processorArchitecture=MSIL", "x86". This
mismatch may cause runtime failures. Please consider changing the targeted processor
achitecture of your project through the Configuration Manager..."

我有两个项目。项目 A 和 B。两者都是 .net c# Visual Studio (2013) 项目。 项目 A 是一个 Windows 服务,项目 B 是一个简单的 Windows 窗体应用程序。它们都使用一个公共(public)库(也可以是任何 cpu),并且(有时)再次使用 x86 库。

项目A(Windows服务,AnyCpu)-->CommonLibrary(AnyCPU)-->UtilityLibrary(x86)

项目 B(WinForms、AnyCpu)-->CommonLibrary(AnyCPU)-->UtilityLibrary(x86)

在项目 A 中,我在使用 UtilityLibrary 时遇到运行时错误。但不是来自 Project B。 一旦UtilityLibrary在“任何CPU”中构建,或者项目A在x86中构建,项目A中的运行时错误就会解决,所以我知道它与此有关。

我的问题是:在哪些情况下会发生使用特定于架构的库的运行时错误?

UtilityLibrary 是最近软件版本的一部分,CommonLibrary 是一个 API,也是该软件版本的一部分。我正在尝试确定这样做的后果。 在未来的版本中,UtilityLibrary 将为 AnyCpu 构建,因为没有理由选择 X86。

最佳答案

如果在 64 位计算机上运行,​​标准行为是在 64 位进程而不是 32 位进程中运行 AnyCPU 可执行文件。标记为 x86 的程序集将无法在 64 位进程中加载​​。 .NET Framework 假定其中存在特定于体系结构的内容,并且最好预先报告问题,而不是在执行特定于体系结构的操作时崩溃或执行错误的操作。

构建工具警告您,如果您在这种情况下运行它,就会发生这种情况。

如果您确定 UtilityLibrary 不包含任何特定于处理器的代码或依赖于仅作为 32 位库提供的任何内容(例如 JET 数据库引擎),则可以通过更改 header 来避免重新编译,使用CorFlags.exe 。您需要的命令是:

corflags <path-to-assembly> /32bit-

在 .NET 4.5 中,提供了一个新选项:“首选 32 位”。对于 C# 编译器,此选项为 /platform:anycpu32bitpreferred。如果 32 位运行时可用,则标有此值的可执行文件将在 64 位计算机上的 32 位进程中运行。在Windows 7/Server 2008 R2及更高版本中,实际上可以删除允许32位程序运行的WOW64层。如果您将可执行文件标记为“x86”,那么如果没有 WOW64,它根本无法运行,但如果您使用任何 CPU + 首选 32 位,它将作为 64 位进程运行。

对于新的 Windows 窗体和 Windows 服务项目,Visual Studio 2013 的默认设置是“任何 CPU”和“首选 32 位”。 (在 Update 3 上测试。)从旧版本的 Visual Studio 升级的项目可能有不同的设置。如果 ProjectB 是在旧版本上创建的,或者有人更改了该设置,这可能可以解释为什么 ProjectB 可以工作而 ProjectA 却不能。

关于c# - 处理器架构问题(x86 与任何 cpu),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27037433/

相关文章:

c# - 触发器 VS 转换器

c# - 如何将图表更改为列渐变填充样式?

c# - 用年份格式化 TimeSpan

.net - 如何在灰色位图图像上绘制彩色形状?

linux - 为什么clflush需要+m常量

C# 将文件从一个目录移动到 Azure 文件共享上的另一个目录

c# - 在内存中创建 FileStream 而不是在磁盘上保存一个物理文件

c# - 更新表中一行的正确 sql 是什么?

visual-studio-2010 - 为 Visual Studio 应用程序设置平台目标的目的是什么?

assembly - 标签移动到register和sub是什么意思?