ALINK:警告AL1073:引用的程序集"mscorlib.dll"针对不同的处理器

jer*_*ome 28 .net c# msbuild visual-studio-2010 visual-studio-2013

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

在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
Run Code Online (Sandbox Code Playgroud)

Mat*_*ith 31

这是一个解决方法:

通过使用与您尝试构建的平台(或位数)匹配的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>  
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编辑.csproj文件以在文件末尾附近导入此文件(您将在其中看到"修改构建过程..."的注释:

     <Import Project="MsBuildAL1073WarningWorkaround.targets" />
     <!-- To modify your build process... -->
    
    Run Code Online (Sandbox Code Playgroud)

  • 看起来像添加`<PropertyGroup> <TargetFrameworkSDKToolsDirectory Condition ="$(PlatformTarget)'=='x64'"> $(TargetFrameworkSDKToolsDirectory)$(PlatformTarget)\ </ TargetFrameworkSDK ToolsDirectory> </ PropertyGroup>`项目文件删除警告 (8认同)
  • 对于 vs2019,在 `$(TargetFrameworkSDKToolsDirectory)` 和 `$(PlatformTarget)` 之间添加反斜杠 (\),以便最终的 PropertyGroup 如下所示: `&lt;PropertyGroup&gt; &lt;TargetFrameworkSDKToolsDirectory Condition=" '$(PlatformTarget)' == ' x64'"&gt;$(TargetFrameworkSDKToolsDirectory)\$(PlatformTarget)\&lt;/TargetFrameworkSDKToolsDirectory&gt; &lt;/PropertyGroup&gt;` (3认同)
  • 这无疑为我指明了正确的方向,但最终没有解决我的问题。只需按照@IAN的建议添加PropertyGroup即可添加警告。请参阅https://thorarin.net/blog/post/2019/02/08/al1703-warning-mscorlib.aspx作为我的解决方案。 (2认同)
  • 我必须在上面的示例中将“TargetFrameworkSDKToolsDirectory”替换为“SdkToolsPathMaybeWithx64Architecture”。请参阅 https://github.com/dotnet/msbuild/issues/5981#issuecomment-849808889 (2认同)

Jer*_*yal 14

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

这是微软方面的错误,截至2017年8月,微软仍然没有修复它.

以下是MS反馈页面的引用:

它是由.NET框架二进制alink.dll中的逻辑错误引起的.但鉴于此问题影响有限以及此工具具有很高的服务标准,我们不会对此问题进行更改.

问候,

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


jer*_*ome 8

可以安全地忽略此警告.由于.Net将在64位机器上运行时加载正确的64位组件.微软仍然可以为这个问题提供可靠的答案.浪费警告是不必要的时间.

  • 并没有真正回答问题,在许多情况下,我们需要删除警告,例如在构建服务器上,如果有警告,您通常希望构建失败,不幸的是,不能忽略此特定警告。 (2认同)

dir*_*ird 7

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

从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]
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

  • 你是怎么得到这个工作的?我正在使用.NET 4.6运行VS2015并且仍然向我发出警告,最糟糕的是当我尝试安装并运行应用程序时,确切的dll会让我误入歧途. (2认同)

Jan*_*ský 6

我们遇到了同样的问题,最终得到了Matt Smith的解决方法(/sf/answers/2936163331/),其中一项修改使其成功.

由于MsBuild中的功能/错误(/sf/answers/95711661/),我们需要修改步骤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>
Run Code Online (Sandbox Code Playgroud)


Lev*_*ncz 5

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

靠近文件末尾

在该行之后

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Run Code Online (Sandbox Code Playgroud)

我已经测试过,如果上面的行位于$TargetFrameworkSDKToolsDirectory的(重新)定义之前,则 AL1073 警告消失。否则它会持续存在。