将构建任务与多目标解决方案一起使用
Posted
技术标签:
【中文标题】将构建任务与多目标解决方案一起使用【英文标题】:Using build tasks with multitarget solutions 【发布时间】:2021-06-04 19:22:28 【问题描述】:我有一个使用 VS2019 的 C# 项目的基本构建任务示例,当我针对 net48
等单个框架时,它可以按预期工作
public class MyTask : Microsoft.Build.Utilities.Task
public override bool Execute()
Log.LogMessage("Hey I ran!");
return true;
我的 csproj:
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
</PropertyGroup>
<UsingTask TaskName="MyTask" AssemblyFile="bin\Debug\net48\MyAssembly.dll" />
<Target Name="SomeTask" AfterTargets="Build>
<MyTask />
</Target>
但是,如果我尝试多目标我的应用程序(需要我分发的一个使用良好的 nuget 包),任务将无法运行。我试过添加变量甚至一些条件,但总是找不到任务程序集或任务本身。
<UsingTask TaskName="MyTask" AssemblyFile="bin\Debug\$(TargetFramework)\MyAssembly.dll" />
<UsingTask TaskName="MyTask" AssemblyFile="bin\Debug\net48\MyAssembly.dll" Condition="'$(TargetFramework)' == 'net48'" />
启用多目标时的错误:
MyProject.csproj(71,3): error MSB4036: The "MyTask" task was not 成立。检查以下内容:1.) 项目中的任务名称 文件与任务类的名称相同。 2.) 任务类是 “public”并实现 Microsoft.Build.Framework.ITask 接口。 3.) 在项目文件或位于“C:\Program”的 *.tasks 文件中正确声明了任务 Files\dotnet\sdk\5.0.200" 目录。
尝试解析程序集时的错误:
MyProject.csproj(70,3): error MSB4062: The "MyTask" task could not be 从程序集 B:..\bin\Release\MyAssembly.dll 加载。不能 加载文件或程序集“B:..bin\Release\MyAssembly.dll”。系统 找不到指定的文件。确认 声明是正确的,程序集及其所有依赖项都是 可用,并且该任务包含一个公共类,该类实现 Microsoft.Build.Framework.ITask。
有人知道如何解决这个问题吗?
【问题讨论】:
这可能是一个有争议的问题,但似乎这可能与以前版本的 msbuild 或框架中的某些东西一起工作 - 它只是在过去 3-6 个月的某个时候表现得这样,我无法再使用通过 nuget 分发的任务了。 嗨迈克尔,关于这个问题的任何更新? 是的,我还没有机会回过头来使用您的解决方案进行测试,我今天会尽力做到这一点(我最终放弃了 ILRepack 任务,但想去如果它会工作,回到它) 当然。这是你的选择,我一直都在。 有关此问题的任何更新,请检查我的回答是否有助于您处理该问题。如果有帮助,请不要忘记accept it。如果没有,请随时告诉我们:) 【参考方案1】:请检查文件夹bin\Debug\net48\
是否有文件MyAssembly.dll
。在我这边,它说文件不能从obj\Debug\net48\MyTask.dll
复制到bin\Debug\net48\MyTask.dll
,它被MSbuild.exe锁定。
无论是它还是您的问题,请尝试以下步骤:
1)先删除bin
和obj
文件夹,并确保程序集dll的名称正确。
2) 然后,从csproj
文件中删除这些:
<UsingTask TaskName="MyTask" AssemblyFile="bin\Debug\net48\MyAssembly.dll" />
<Target Name="SomeTask" AfterTargets="Build">
<MyTask />
</Target>
3)关闭VS Instance,然后重启你的项目,首先,构建你的项目。
之后,重新添加SomeTask
自定义目标,然后点击Build
按钮而不是重建按钮。我已经把它们都放到同一个项目中了。
另外,如果你点击Rebuild
,加载dll的使用任务被MSBuild.exe
使用,同时msbuild清理和重新复制MyAssembly.dll
。而且它们会相互冲突。此外,该行为是由于您将 UsingTask
放在同一个项目中引起的。而最好的测试方法是新建一个单独的项目,然后使用UsingTask
。
添加细节:
要解决这个问题,你应该关闭msbuild.exe
进程,然后你可以每次点击重建。
【讨论】:
以上是关于将构建任务与多目标解决方案一起使用的主要内容,如果未能解决你的问题,请参考以下文章