0

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

A -> B -> C -> 通过 .NET Wrapper 的原生 DLL

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

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

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

    或者

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

4

1 回答 1

2

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

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

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

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

2) msbuild Copy 任务有一个“SkipUnchangedFiles”参数,仅当文件比现有文件更新时才会复制文件:

<Target Name="AfterBuild">
    <Copy
        SourceFiles="@(DllLocation)"
        DestinationFolder="@(DllLocation->'$(OutputDir)%(RecursiveDir)%(Filename)%(Extension)')"
        SkipUnchangedFiles="true"
    />
</Target>
于 2015-08-12T20:14:08.833 回答