【问题标题】:Conditionally Copy Dependencies MSBuild有条件地复制依赖项 MSBuild
【发布时间】:2015-08-12 19:38:37
【问题描述】:

我们设置了我们的解决方案,以便项目 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)。

【问题讨论】:

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


    【解决方案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>
    

    【讨论】:

    • 我能够通过使用:Exec Command="taskkill /fi &amp;quot;IMAGENAME eq ProcessToKill.exe&amp;quot; /F" 让进程自行清理,就好像进程碰巧没有运行一样,使用 /IM 开关会引发错误。此外,必须将项目 A 的引用添加到项目 C 以防止 DLL 被删除。感谢您的帮助!
    猜你喜欢
    • 2016-03-07
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多