MSBuild 4.0 或 Visual Studio 2010 可能无法编译针对 x64 计算机上的 .NET Framework 3.5、3.0 或 2.0 的 32 位应用程序

本文有助于解决 MSBuild 4.0 或 Microsoft Visual Studio 2010 无法编译针对 x64 计算机上的 .NET Framework 3.5、3.0 或 2.0 的 32 位应用程序的问题。

原始产品版本: Visual Studio 2010
原始 KB 数: 2028833

现象

你正在使用 Visual Studio 2010 在 x64 计算机上生成针对 x86 配置的应用程序。 该项目包含一个引用 32 位程序集的资源文件。 选择的目标框架是 3.5、3.0 或 2.0。

你可能会收到以下错误:

Form1.resx(161,5):错误 RG0000:无法加载文件或程序集“<file_name>”或其依赖项之一。 试图加载的程序的格式不正确。 第 161 行,位置 5。

诊断生成日志显示该任务 GenerateResource 失败。

原因

<system_drive>:\Program Files (x86)\Microsoft SDKs\Windows\vx.x\bin中的 Resgen.exe 是 Windows SDK 的一部分,标记为 MSIL,因此它将作为 64 位进程运行。 它将尝试加载 32 位程序集但未成功。

决议

为了解决此问题,需要执行以下步骤:

  1. 关闭 Visual Studio 的所有实例。

  2. 从 Visual Studio Tools 子文件夹中,打开提升的 Visual Studio 命令提示符 (2010)(使用“以管理员身份运行”选项)。 将目录更改为<system_drive>:\Program Files (x86)\Microsoft SDKs\Windows\v<x.xx>\bin\

  3. 发出命令:

    corflags /32bit+ ResGen.exe /force
    
  4. 在记事本中打开 <project_name.csproj>。

  5. <ResGenToolArchitecture>Managed32Bit</ResGenToolArchitecture>部分下添加属性PropertyGroup。 保存并关闭 csproj 文件。

详细信息

如果希望生成一个引用 64 位程序集(针对 v3.5、v3.0 或 v2.0)的 .resx 文件,则可能必须在执行此操作前逆向使用此解决方法。

CorFlagsCorFlags.exe(CorFlags 转换工具)可能会对你有所帮助。