MSBuild使用TaskTask的AssemblyFile指向当前项目的dll

时间:2019-07-15 09:03:27

标签: visual-studio msbuild msbuild-task

我在Visual Studio中有一个项目“ Project1”,其中包含一个实现Microsoft.Build.Utilities.Task的类。我希望在构建Project1之后执行此任务。

在“ Project1”的项目文件中,我具有以下内容:

<UsingTask
    AssemblyFile="$(MSBuildThisFileDirectory)bin\Debug\net462\Project1.dll" 
    TaskName="MyTask"/>

<Target Name="ExecuteMyTask" AfterTargets="Build">
    <MyTask/>
</Target>

当我构建Project1时,它尝试在构建后执行MyTask,但似乎无法找到Project1.dll(即使在构建后就存在了并且路径正确),也出现了以下错误: :“未找到” MyTask“任务”

如果我第二次构建,则一切正常,前提是假定dll在过程开始时就已存在。即使目标是使用AfterTargets =“ Build”声明的,它似乎仍试图在构建步骤之前寻找dll。

如何在构建后执行此任务?

1 个答案:

答案 0 :(得分:0)

确保you copy the Project1.dll to bin\Debug\net462 folder的设置输出路径的方式。原因是构建过程中的顺序为:compile the code to .cs in obj folder => copy the assembly from obj to bin folder。我不确定您是否有第三项操作,如using target or post-build event,将程序集从bin\Debug复制到bin\Debug\net462,因此请先尝试通过设置OutputPath属性来实现。

我敢肯定,如果我们用声明AfterTargets定义自定义目标,那么在大多数时候执行目标时,它都能找到程序集。但这可能会受到其他因素的影响:装配太大,机器旧了或...避免这种情况的一件事是创建一个新项目,然后进行测试。另外,请确保<Using Task> and <Target>的位置在.csproj的底部。

注意:当<Using Task>尝试使用该程序集时,请确保该程序集未被其他进程占用。