【问题标题】:ALINK : warning AL1073: Referenced assembly 'mscorlib.dll' targets a different processorALINK:警告 AL1073:引用的程序集“mscorlib.dll”针对不同的处理器
【发布时间】:2014-10-11 12:04:09
【问题描述】:

我们正在使用 VS2013 和 .Net 4.5.1(最近迁移,但此错误来自 .Net 4.0)。只有在平台目标 x64 中编译项目时才会出现此错误。这真的是一个会在运行时中断的错误吗?为什么 MSBUILD 不能正确解析这个 mrcorlib.dll?这只发生在 VS2010 中创建的项目中,不会发生在新创建的项目中。我在这里想念什么。我所有的第三方程序集都是 x64 位的。

在 TeamCity 构建服务器中,我收到以下错误:

GenerateSatelliteAssemblies
[17:01:18]AL
[17:01:18]C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\AL.exe /culture:de /keyfile:..\..\MyApp.snk /out:obj\x64\Release\de\MyApp.Hardware.Softing.resources.dll /platform:x64 /template:obj\x64\Release\MyApp.Hardware.Softing.dll /embed:obj\x64\Release\MyApp.Hardware.Softing.Properties.Resources.de.resources
[17:01:18]ALINK warning AL1073: Referenced assembly 'mscorlib.dll' targets a different processor

【问题讨论】:

  • 是的,这是一个严重的问题。您的项目正在使用 c:\windows\microsoft.net 中的参考程序集,而不是 c:\program files\reference 程序集中的参考程序集。非常有害,尤其是针对 .net 4.0 时。你的问题当然不知道这是怎么发生的。
  • @HansPassant 我添加了额外的错误信息。所有框架引用仅引用 C:\Program Files (x86)\Reference Assemblies\ 文件夹。例如:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.Data.dll。但是这个 System.Data.dll 似乎是为引用 mscorlib.dll 的 32 位平台构建的。
  • 同样,System.Data 也是一个混合模式程序集。包含 MSIL 和机器代码。 c:\windows\microsoft.net 中的副本是 32 位版本,在运行时从 GAC 加载正确的版本。但是 c:\program 文件中的副本是特殊的,所有代码都从中剥离,它只包含元数据。因此永远不应该产生这个警告。您可以使用 Corflags.exe、ILOnly 属性仔细检查。

标签: c# .net visual-studio-2010 msbuild visual-studio-2013


【解决方案1】:

在我的情况下,从 Properties/AssemblyInfo.cs 中删除所有属性或删除整个文件修复警告,但这可能不是大多数库的合适解决方案。 Net461,SDK 风格的项目,<GenerateAssemblyInfo> 设置为 false。

【讨论】:

    【解决方案2】:

    这是我的解决方案:

    <PropertyGroup>
      <CreateSatelliteAssembliesDependsOn>
        FixWarningAL1073;
        $(CreateSatelliteAssembliesDependsOn);
      </CreateSatelliteAssembliesDependsOn>
    </PropertyGroup>
    <Target Name="FixWarningAL1073">
      <PropertyGroup>
        <TargetFrameworkSDKToolsDirectory Condition=" '$(PlatformTarget)' == 'x64'">$(TargetFrameworkSDKToolsDirectory)$(PlatformTarget)\</TargetFrameworkSDKToolsDirectory>
      </PropertyGroup>
    </Target>
    

    在 .csproj 的末尾添加这些行。

    【讨论】:

      【解决方案3】:

      只是对马特回答的一些补充(我没有足够的声誉来添加评论):我相信

      接近文件末尾

      就在该行之后

      <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
      

      我已经测试过,如果上面的行在 $TargetFrameworkSDKToolsDirectory 的(重新)定义之前,那么 AL1073 警告就消失了。否则它仍然存在。

      【讨论】:

        【解决方案4】:

        这些警告显示在解决方案中包含本地化附属程序集(.resx 文件)的项目中。

        这是微软方面的错误,截至 2017 年 8 月,微软仍未修复。

        这是来自MS feedback 页面的引用:

        这是由 .NET 框架二进制文件中的逻辑错误引起的 alink.dll。但鉴于这个问题的影响有限,而且事实上 这个工具有很高的维修标准,我们不会做 解决此问题的更改。

        问候,

        Ed Maurer 开发主管,VB 和 C# 编译器

        【讨论】:

        • 最近的 .NET/.NET Core 平台解决了这个错误吗?我现在有同样的问题,使用 .NET Core 2.1...
        • 我在 .NET Core 上仍有问题,仍在寻找解决方案,这里的建议都不适用于 .NET CORE 2.2 我在这里打开了一个新问题:stackoverflow.com/questions/58555465/…
        【解决方案5】:

        我们遇到了同样的问题,最终采用了 Matt Smith 的解决方法 (https://stackoverflow.com/a/41945190/3506760),并进行了一项修改使其工作。

        由于 MsBuild (https://stackoverflow.com/a/1367309/3506760) 中的功能/错误,我们需要修改步骤 1 中描述的目标文件。

        <?xml version="1.0" encoding="utf-8"?>
        <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
            <Target Name="MsBuildAL1073WarningWorkaround" BeforeTargets="BeforeBuild" >
                <PropertyGroup Condition="'$(Platform)' == 'x64'">
                    <TargetFrameworkSDKToolsDirectory>$(TargetFrameworkSDKToolsDirectory)$(Platform)\</TargetFrameworkSDKToolsDirectory>
                </PropertyGroup>
            </Target>
        </Project>
        

        【讨论】:

        • 我对此进行了测试,但它在 .NET Core 3.0 上失败了,我的问题似乎与资源文件有关,因为如果我删除了资源文件,我将不再收到警告。
        【解决方案6】:

        这里有一个解决方法:

        使用与您尝试构建的平台(或位数)匹配的 AL.EXE 可以避免该问题。也就是说,当您构建 x64 时,您会看到它正在尝试在类似于

        的路径上使用 AL.EXE

        C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools

        如果您可以让它使用 x64 版本的 AL.exe,问题就会消失。也就是说,在类似于以下的路径使用 AL.EXE:

        C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64

        Msbuild 通过使用它的TargetFrameworkSDKToolsDirectory 找到这个路径。因此,假设在构建 x86 时该目录是正确的目录,下面的解决方法本质上是在构建 x64 时将 x64 子目录附加到路径上,并保持原样:

        1. 创建一个 MsBuildAL1073WarningWorkaround.targets 文件(名称无关紧要)并将其添加到项目中。内容如下:

          <?xml version="1.0" encoding="utf-8"?>
          <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
            <PropertyGroup>
              <TargetFrameworkSDKToolsDirectory Condition=" '$(PlatformTarget)' == 'x64'">$(TargetFrameworkSDKToolsDirectory)$(PlatformTarget)\</TargetFrameworkSDKToolsDirectory>
            </PropertyGroup>
          </Project>  
          
        2. 编辑 .csproj 文件以在文件末尾附近导入此文件(您将在此处看到“要修改构建过程...”的注释:

           <Import Project="MsBuildAL1073WarningWorkaround.targets" />
           <!-- To modify your build process... -->
          

        【讨论】:

        • 看起来在项目文件末尾添加&lt;PropertyGroup&gt; &lt;TargetFrameworkSDKToolsDirectory Condition=" $(PlatformTarget)' == 'x64'"&gt;$(TargetFrameworkSDKToolsDirectory)$(PlatformTarget)\‌​&lt;/TargetFrameworkSDK‌​ToolsDirectory&gt; &lt;/PropertyGroup&gt; 会删除警告
        • &lt;PropertyGroup&gt; 部分直接添加到我的 .csproj 文件中对我来说适用于 VS 2015 和 .NET 4.6。不过要小心复制/粘贴,因为我有一些额外的空白字符导致它一开始就失败了。
        • 这无疑为我指明了正确的方向,但最终对我的情况不起作用。只需按照@I-A-N 的建议添加 PropertyGroup 就添加了一个警告。请参阅thorarin.net/blog/post/2019/02/08/al1703-warning-mscorlib.aspx 了解我的解决方案。
        • 对于 vs2019,在 $(TargetFrameworkSDKToolsDirectory)$(PlatformTarget) 之间添加一个反斜杠(),以便最终的 PropertyGroup 如下所示:&lt;PropertyGroup&gt; &lt;TargetFrameworkSDKToolsDirectory Condition=" '$(PlatformTarget)' == 'x64'"&gt;$(TargetFrameworkSDKToolsDirectory)\$(PlatformTarget)\&lt;/TargetFrameworkSDKToolsDirectory&gt; &lt;/PropertyGroup&gt;
        • 在上面的示例中,我必须将 TargetFrameworkSDKToolsDirectory 替换为 SdkToolsPathMaybeWithx64Architecture。见github.com/dotnet/msbuild/issues/5981#issuecomment-849808889
        【解决方案7】:

        可以放心地忽略此警告。由于 .Net 将在 64 位机器上运行时加载正确的 64 位程序集。微软仍然可以对这个问题给出一个可靠的答案。这是不必要的浪费时间的警告。

        【讨论】:

        • 链接现在已经失效,即使您使用帐户登录也是如此。 (顺便说一句,我没有否决你的答案。)
        • 并没有真正回答这个问题,在许多情况下,我们需要删除警告,例如在构建服务器上,如果有警告,您经常希望构建失败,不幸的是,这个特定的警告不能被忽略。
        【解决方案8】:

        虽然@jero2rome 引用的错误因无法修复而关闭,但带有 .NET 4.6 的 VS2015 RC 不再发出此警告:

        从 VS2013/.NET 4.5.1 开始,我会看到同样的问题:

        GenerateSatelliteAssemblies:
        C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\AL.exe /culture:zh-CHT /out:obj\x64\Debug\zh-CHT\MyComponent.resources.dll /platform:x64 /template:obj\x64\Debug\MyComponent.dll /embed:obj\x64\Debug\MyComponent.Resources.string.zh-CHT.resources
        ALINK : warning AL1073: Referenced assembly 'mscorlib.dll' targets a different processor [c:\svn\project\MyComponent.csproj]
        

        使用 VS2015 RC/.NET 4.6,不会发出警告:

        GenerateSatelliteAssemblies:
        C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64\AL.exe /culture:zh-CHT /out:obj\x64\Debug\zh-CHT\MyComponent.resources.dll /platform:x64 /template:obj\x64\Debug\MyComponent.dll /embed:obj\x64\Debug\MyComponent.Resources.string.zh-CHT.resources
        

        【讨论】:

        • 你是如何让它工作的?我正在使用 .NET 4.6 运行 VS2015,但仍然向我发出警告,最糟糕的是,当我尝试安装和运行应用程序时,那个确切的 dll 让我陷入错误。
        【解决方案9】:

        要忽略该警告,您可以为所有 OS_x86_x64 安装与 VS2013 兼容的 .Net Framework 4.5.2 开发人员包。 http://www.microsoft.com/en-us/download/details.aspx?id=42637

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-24
          • 2014-05-16
          相关资源
          最近更新 更多