有条件地复制依赖项 MSBuild

Conditionally Copy Dependencies MSBuild

我们设置了解决方案,以便项目 A 引用项目 B,项目 B 引用项目 C,而项目 C 有一个引用本机 DLL 的 .NET 包装器。

A -> B -> C -> 通过 .NET Wrapper 的本机 DLL

卷积的原因是我们正在处理第 3 方硬件,或者我们会直接从项目 B 引用 DLL。无论如何 --

我们正在尝试获取项目 C 中引用的一些文件(本机 DLL),并将其复制到项目 A。使用“内容”的构建操作复制本地不起作用 因为 MSBuild 会失败,说它无法覆盖文件,因为它们一旦启动就会启动,进程不会自行清理并保持 运行.

  1. 是否可以让 MSBuild 在构建之前尝试终止进程?

  2. 如果原生 DLL 在 MSBuild 中不存在,是否可以有条件地将它们从项目 B 复制到项目 A?项目 A 的 bin 文件夹是它们启动的地方,也是构建失败的地方(不是从项目 C 到 B)。

听起来您的主要问题是您的应用程序无法自行清理。如果您的应用程序正在启动进程,它应该在关闭时停止它们。您应该在应用程序关闭之前对您启动的任何进程调用 Process.Kill()。

话虽如此,1) 和 2) 都是可能的:

1) 您可以使用 Exec task 从 msbuild 调用任何可执行文件。您可以使用此任务调用 "taskkill" 命令。

 <Target Name="BeforeBuild">
    <Exec Command="taskkill /IM ProcessToKill.exe /F"/>
</Target>

2) msbuild Copy task 有一个 "SkipUnchangedFiles" 参数,只有当文件比现有文件更新时才会复制文件:

<Target Name="AfterBuild">
    <Copy
        SourceFiles="@(DllLocation)"
        DestinationFolder="@(DllLocation->'$(OutputDir)%(RecursiveDir)%(Filename)%(Extension)')"
        SkipUnchangedFiles="true"
    />
</Target>