有条件地复制依赖关系MSBuild

时间:2015-08-12 19:38:38

标签: c# msbuild xcopy project-reference msbuild-projectreference

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

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

卷积的原因是我们正在处理第三方硬件,或者我们将直接从项目B引用DLL。

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

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

    或者

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

1 个答案:

答案 0 :(得分:1)

听起来你的主要问题是你的应用程序不会自行清理。如果您的应用程序正在启动进程,则应在关闭时停止它们。您应该在应用程序关闭之前启动的任何进程上调用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>