4

TFS 已发出以下警告:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets (1605):正在构建的项目“MSIL”的处理器架构与参考“C: \Windows\Microsoft.NET\Framework64\v4.0.30319\System.Data.dll”、“AMD64”。这种不匹配可能会导致运行时失败。请考虑通过配置管理器更改项目的目标处理器体系结构,以便在项目和参考之间对齐处理器体系结构,或者依赖具有与项目的目标处理器体系结构匹配的处理器体系结构的参考。

“发布”和“调试”配置均设置为使用“任何 CPU”作为活动解决方案平台。

我将 System.Data.dll 的副本放入 TEMP 文件夹,并通过 PowerShell 提取有关此程序集的信息:

function ScanAssembly($assemblyPath) {
    [reflection.assemblyname]::GetAssemblyName($assemblyPath) 
}

$assemblyPath = "C:\TEMP\System.Data.dll"

$assemblyInfo = ScanAssembly($assemblyPath);
$assemblyInfo | fl;

我得到以下输出:

Name                  : System.Data
Version               : 4.0.0.0
CultureInfo           : 
CultureName           : 
CodeBase              : file:///C:/TEMP/System.Data.dll
EscapedCodeBase       : file:///C:/TEMP/System.Data.dll
ProcessorArchitecture : Amd64
ContentType           : Default
Flags                 : PublicKey
HashAlgorithm         : SHA1
VersionCompatibility  : SameMachine
KeyPair               : 
FullName              : System.Data, Version=4.0.0.0, Culture=neutral, 
                        PublicKeyToken=...

出于某种原因,此程序集的 ProcessorArchitecture 设置为 Amd64。我对为什么将其设置为 Amd64 感到困惑,因为我在 Intel 处理器上运行 64 位操作系统。

这些警告不是显示停止器,但我很难理解为什么我们会看到它们。如果我理解正确,配置设置为任何 CPU,当其中一个程序集为 Amd64 编译时,这意味着它将不再在任何 CPU 上工作 - 它只能在 64 位 CPU 上工作。为什么 System.Data.dll 是为 Amd64 构建的,这超出了我的理解。

谢谢你。

4

1 回答 1

8

您对为什么会发生这些错误是正确的。如果引用的程序集以特定框架为目标,编译器会警告您的应用程序无法在“任何 CPU”上运行,因为引用的程序集有限制。

我们在带有 System.Data 和其他 DLL 的测试和生产服务器上遇到了这个问题。我们通过安装 .Net Framework SDK 解决了这个问题。要做到这一点:

  1. 找到正确的 SDK。我们的环境是使用 Windows Server 2008 和 .Net Framework 4.5 设置的,因此我们使用了Windows 8 SDK
  2. 仅安装 .Net Framework 4.5 SDK(接受许可后,屏幕上有几个复选框;我只选中了最后一个)。

SDK 在 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5 中添加了新版本的 System.Data.dll。检查该程序集,您可以看到 ProcessorArchitecture 设置为None

Name                  : System.Data
Version               : 4.0.0.0
CultureInfo           :
CultureName           :
CodeBase              : file:///C:/Program Files (x86)/Reference\Assemblies/Microsoft/Framework/.NETFramework/v4.5/System.Data.dll
EscapedCodeBase       : file:///C:/Program%20Files%20(x86)/Reference%20Assemblies/Microsoft/Framework/.NETFramework/v4.5/System.Data.dll
ProcessorArchitecture : None
ContentType           : Default
Flags                 : PublicKey
HashAlgorithm         : SHA1
VersionCompatibility  : SameMachine
KeyPair               :
FullName              : System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

如果可以的话,另一个选项是将您的项目配置为针对 64 位处理器,但我们的团队选择了 SDK 路线。

于 2013-10-30T20:39:09.657 回答