.net - 构建 x64 版本时出现 CS1607 编译器警告

标签 .net 64-bit

当我在 Windows Server 2003 上使用 Visual Stuido 2008 构建 x64 版本的 .net 应用程序时 我明白

警告 CS1607:程序集生成 - 引用的程序集“mscorlib.dll”针对不同的处理器

这是否意味着我还没有安装 x64 版本的 .NET?

完整报告在这里

16>C:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /platform:x64 /errorreport:prompt /define:DEBUG;TRACE /reference:..........\BIN\Jfc.Dealing\Jfc.Configuration.ConfigurationLayer.dll /reference:..........\BIN\Jfc.Dealing\Jfc.Sys.dll /reference:D:\Projects\dzhukov\SourceCode_Integration_branch\TradeProcessor\Jfc\QuikExport\bin\x64\Debug\QuikExport.dll /reference:D:\Projects\dzhukov\SourceCode_Integration_branch\Samples\JFC\FxGate\QuoteFeedWcfRemoteControl\bin\x64\Debug\QuoteFeedWcfRemoteControl.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll /reference:"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll" /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Runtime.Serialization.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.ServiceModel.dll" /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll" /debug+ /debug:full /filealign:512 /out:obj\x64\Debug\FeedRawQuotes.exe /target:exe FeedRawQuotes.cs FeedRawQuotesConfiguration.cs MSMQFeed.cs Program.cs Properties\AssemblyInfo.cs warning CS1607: Assembly generation -- Referenced assembly 'System.Data.dll' targets a different processor warning CS1607: Assembly generation -- Referenced assembly 'mscorlib.dll' targets a different processor

最佳答案

这是一个正常警告,当您明确定位 x64 时,您总会收到它。这在运行时不会成为问题,因为在 64 位计算机上,GAC 存储 mscorlib.dll 的 64 位特定版本。

长版本:多个 .NET 程序集包含非托管代码。这使得它们对使用它们的进程的位数很敏感。 Mscorlib.dll 就是其中之一,System.Data.dll 和 WPF 程序集是其他示例。 Microsoft 通过构建这些程序集的两个版本(32 位版本和 64 位版本)解决了这一问题。 GAC 可以存储它们,由 AssemblyName.ProcessorArchitecture 属性解析。此属性的“正常”设置是 MSIL,当程序集包含纯 IL 时使用。然后,32 位和 64 位进程都可以使用该程序集的单个副本。

编译器使用的引用程序集是 .NET 程序集的副本。编译器纯粹将它们用于元数据。然而,这些副本是 32 位程序集的副本,对于包含非托管代码的程序集,它们会将 ProcessArchitecture 设置为 X86。

您可以看到它的去向,您正在针对 x64 进行编译,并且编译器会看到 x86 引用程序集。足以生成警告“仅当您还提供 x64 版本的程序集时,此程序才能运行”。对于 .NET 程序集来说肯定是这样,但对于您自己的程序集则不一定如此。

也许值得注意的是,这个问题在 .NET 4.0 中得到了解决。它使用非常不同的引用程序集,这些程序集存储在C:\Program Files (x86)\Reference Assemblies中。与 v2 引用程序集不同,它们与 GAC 中的副本有很大不同。所有 MSIL 都被剥离,它们只包含元数据。并且是 AnyCPU,因此不再有警告。用于创建它们的工具很有趣,不幸的是 Microsoft 没有与我们分享。

Fwiw,明确针对 x64 几乎总是错误的做法。它只对 EXE 程序集真正重要,因为它决定了进程的位数。 DLL 程序集没有选择,适合它们的build设置是“任何 CPU”,因此它们可以以两种方式工作。罕见的异常(exception)是 DLL 对非托管组件(通常是 COM 服务器)具有已知的依赖性。此类组件通常仅以 32 位图像形式提供,当您尝试在 64 位进程中加载​​它们时,您会收到难以诊断的错误消息(“类未注册”)。通过强制它们以 x86 为目标,您会遇到另一个难以诊断的异常,但可能看起来更容易一些,即 BadImageFormatException。对仅在 64 位代码中可用的非托管代码的依赖非常罕见,因此针对 x64 没有多大意义。

关于.net - 构建 x64 版本时出现 CS1607 编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4077005/

相关文章:

.net - 在 Disposable 模式中什么算作 "Unmanaged Resource"?

c# - 如何使用 PowerShell 安装此 Service Fabric 项目?

c# - 项目 'ClassLibrary1.csproj' 目标 'netcoreapp2.1' 。它无法被目标为 '.NETFramework,Version=v4.7.2' 的项目引用

.net - 如何监视 .NET TaskScheduler 中的任务队列(跨 AppDomain)

Windows 64 ABI,如果我不调用 Windows API,正确的寄存器使用?

deployment - 32 位 PowerShell 是否始终存在于 64 位 Windows 2008 R2 上?

c - Win64下获取用户名

c# - 应用程序日志架构

assembly - ARM 汇编 SOS 中的 64 位除法

c - 为什么C语言中指针的大小相同