在.Net核心项目构建过程中,ITask无法加载

时间:2017-03-17 00:39:41

标签: msbuild asp.net-core .net-core msbuild-task

我有一个相当简单的类继承自ITask,并作为更新版本(VersionUpdater.dll)的构建任务运行。项目文件条目如下:

<UsingTask TaskName="VersionUpdater" AssemblyFile="VersionUpdater.dll" />
<Target Name="BeforeBuild">
  <VersionUpdater />
</Target>

这对于常规.Net项目来说非常好;但是我试图在.Net Core项目构建任务中加载它并获得了这个:

  

严重级代码描述项目文件行抑制状态   错误MSB4062&#34; VersionUpdater&#34;任务无法从中加载   程序集C:... \ VersionUpdater.dll。无法加载文件或程序集   &#39;文件:/// C:\ VersionUpdater.dll&#39;或其中一个依赖项。该   系统找不到指定的文件。确认一下   声明是正确的,程序集及其所有依赖项都是   可用,并且该任务包含实现的公共类   Microsoft.Build.Framework.ITask。

好的,所以我想也许现在必须使用.Net Core构建DLL,所以我做了,并创建了VersionUpdater.Core.dllAssemblyFile="VersionUpdater.Core.dll"),并得到了这个错误:

  

严重级代码描述项目文件行抑制状态   错误MSB4062&#34; VersionUpdater&#34;任务无法从中加载   程序集C:... \ VersionUpdater.Core.dll。无法加载文件或   程序集&#39; System.Runtime ,版本= 4.1.0.0,文化=中立,   公钥= b03f5f7f11d50a3a&#39;或其中一个依赖项。该   系统找不到指定的文件。确认一下   声明是正确的,程序集及其所有依赖项都是   可用,并且该任务包含实现的公共类   Microsoft.Build.Framework.ITask。

正如我所说,该代码适用于普通的.Net项目。它只是不想与.Net Core项目合作。我失踪了什么?是否为.Net Core找不到System.Runtime的错误?

(来源在这里:https://github.com/rjamesnw/VersionUpdater

1 个答案:

答案 0 :(得分:1)

要使任务与“dotnet msbuild”和MSBuild.exe一起使用,您需要交叉编译.NET Framework的任务和.NET Core兼容的框架,例如.NET Standard。然后,您需要更改基于哪个任务程序集加载以及MSBuild的运行时类型。您可以使用MSBuildRuntimeType检测到这一点。例如,

 <PropertyGroup>
    <TaskAssembly Condition=" '$(MSBuildRuntimeType)' == 'Core'">.\bin\Debug\netstandard1.6\MyTaskAssembly.dll</TaskAssembly>
    <TaskAssembly Condition=" '$(MSBuildRuntimeType)' != 'Core'">.\bin\Debug\net46\MyTaskAssembly.dll</TaskAssembly>
  </PropertyGroup>

  <UsingTask TaskName="MyTaskName" AssemblyFile="$(TaskAssembly)" />

有关详细说明和示例,请参阅此博客文章。 http://www.natemcmaster.com/blog/2017/07/05/msbuild-task-in-nuget/