我有一个为 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/