在加上 IL Link 的项目里面,在升级到 .NET 6 预览版,有一些项目将会构建不通过,或者有些 C++ CLI 项目加载失败。提示 元素 UsingTask 中“AssemblyFile”特性的值“$(ILLinkTasksAssembly)”的计算结果“”无效。原因就是 .NET 6 预览版里面,或者自己的设备上 ILLinkTasksAssembly 属性定义失效

解决方法是先创建一个空白项目,找找自己本地的 ILLinkTasksAssembly 定义是否存在,默认在 SDK 里面是存在 Microsoft.NET.ILLink.Tasks 的。如果发现自己的设备上不存在 Microsoft.NET.ILLink.Tasks 这个文件夹,那么请将 dotnet sdk 卸载重新安装,或者安装更新版本的 sdk 然后查看自己的环境变量,是否有设置特定版本的 dotnet sdk 如果有设置,就删除此项值或者修改为更新版本

创建空白项目,找找自己本地的 ILLinkTasksAssembly 定义的做法是在空项目的 csproj 里面添加如下代码,用来输出 IL Link 的路径

  <Target Name="Foo" BeforeTargets="BeforeBuild">
    <Warning Text="$(ILLinkTasksAssembly)"/>
  </Target>

此时的空白项目的 csproj 内容大概如下

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

  <Target Name="Foo" BeforeTargets="BeforeBuild">
    <Warning Text="$(ILLinkTasksAssembly)"/>
  </Target>
</Project>

此时构建这个空白项目,可以看到输出的警告,警告里面就是 IL Link 的路径。如 C:\Program Files\dotnet\sdk\6.0.100-preview.2.21155.3\Sdks\Microsoft.NET.ILLink.Tasks\Sdk\..\tools\net472\ILLink.Tasks.dll 的路径

在自己构建失败的项目,或者加载失败的 C++\CLI 项目的项目文件里面,在 PropertyGroup 里面添加如下代码

<ILLinkTasksAssembly>C:\Program Files\dotnet\sdk\6.0.100-preview.2.21155.3\Sdks\Microsoft.NET.ILLink.Tasks\Sdk\..\tools\net472\ILLink.Tasks.dll</ILLinkTasksAssembly>

在 PropertyGroup 添加如上代码的效果如下

  <PropertyGroup>
    <ILLinkTasksAssembly>C:\Program Files\dotnet\sdk\6.0.100-preview.2.21155.3\Sdks\Microsoft.NET.ILLink.Tasks\Sdk\..\tools\net472\ILLink.Tasks.dll</ILLinkTasksAssembly>
  </PropertyGroup>

请将上面的路径替换为你自己本地的路径,大概此时就能修改构建或项目加载。本文的方法能修复的是在构建和加载项目提示如下内容

 error  : 元素 <UsingTask> 中“AssemblyFile”特性的值“$(ILLinkTasksAssembly)”的计算结果“”无效。  C:\Program Files\dotnet\sdk\6.0.100-preview.2.21155.3\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.ILLink.targets

在 Microsoft.NET.ILLink.targets 文件可以看到如下定义

 <UsingTask TaskName="ILLink" AssemblyFile="$(ILLinkTasksAssembly)" />

上面提示内容就是 $(ILLinkTasksAssembly) 没有定义,拿到空值。因此自己在项目里面加上定义是可以解决此问题

本文的空项目代码放在 github 欢迎小伙伴访问


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/dotnet-%E4%BF%AE%E5%A4%8D-ILLinkTasksAssembly-%E7%89%B9%E6%80%A7%E7%9A%84%E5%80%BC%E7%9A%84%E8%AE%A1%E7%AE%97%E7%BB%93%E6%9E%9C%E6%97%A0%E6%95%88.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

微软最具价值专家


无盈利,不卖课,做纯粹的技术博客

以下是广告时间

推荐关注 Edi.Wang 的公众号

欢迎进入 Eleven 老师组建的 .NET 社区

以上广告全是友情推广,无盈利