将构建任务与多目标解决方案一起使用

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)先删除binobj文件夹,并确保程序集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进程,然后你可以每次点击重建

【讨论】:

以上是关于将构建任务与多目标解决方案一起使用的主要内容,如果未能解决你的问题,请参考以下文章

C - SIGINT处理程序不能与多线程一起工作,每个线程都有一个popen进程。

将捆绑包与 xibs XCode5 一起使用

将 django ORM 与多处理一起使用?

将 shared_ptr 与多继承类一起使用

PythonStudy——多线程与多进程 对比

SSIS“数据流任务”平面文件目标中没有记录