【问题标题】:MSBuild UsingTask declaration with AssemblyFile pointing to dll of current projectMSBuild UsingTask 声明,AssemblyFile 指向当前项目的 dll
【发布时间】:2019-11-23 23:03:46
【问题描述】:

我在 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 在进程开始时已经存在。即使 Target 是用 AfterTargets="Build" 声明的,它似乎也试图在构建步骤之前查找 dll。

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

【问题讨论】:

  • 在此过程中,您何时将 Project1.dll 放入bin\debug\net462 文件夹?
  • 是的,这就是它的构建目标。我知道路径是正确的,因为它在第二次构建时找到了它。
  • 对不起,如果问题不清楚,dll是Project1的编译输出。我无法在项目中添加对它自己的 dll 的引用
  • 为什么你的输出路径是bin\Debug\net462而不是bin\Debug,我尝试在任务项目中使用task.dll但它第一次成功(我删除了bin和obj以确保天气晴朗)。我确信AfterTargets="Build" 可以适用于这种情况。你能分享csproj中设置Project1.dll路径的内容吗?或者也许我分享一个成功的简单示例?
  • 我认为输出路径是这样的,只是因为我的目标框架是net462。我在 csproj 中看不到任何明确设置输出路径的内容,这正是 Visual Studio 放置 dll 的地方。一个有效的简单示例会有所帮助。

标签: visual-studio msbuild msbuild-task


【解决方案1】:

确保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 定义自定义目标,它在大多数时间执行目标时都可以找到程序集。但它可能会受到其他因素的影响:组件太大,机器太旧或......避免这种情况的一件事是创建一个新项目然后测试。另外,请确保您的 &lt;Using Task&gt; and &lt;Target&gt; 的位置位于 .csproj 的底部。

注意:&lt;Using Task&gt;尝试使用程序集时,请确保它没有被其他进程占用。

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 2018-04-12
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多