我有一个相当简单的类继承自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.dll
(AssemblyFile="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的错误?
答案 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/