0

プロジェクト A がプロジェクト B を参照し、プロジェクト B がプロジェクト C を参照し、プロジェクト C がネイティブ DLL を参照する .NET ラッパーを持つように、ソリューションをセットアップしました。

A -> B -> C -> .NET ラッパー経由のネイティブ DLL

畳み込みの理由は、サードパーティのハードウェアを扱っているか、プロジェクト B から直接 DLL を参照するためです。とにかく --

プロジェクト C で参照され、プロジェクト A にコピーされたいくつかのファイル (ネイティブ DLL) を取得しようとしています。 「コンテンツ」のビルド アクションを使用したローカル コピーは機能しません。それらが起動し始めると、プロセスはその後クリーンアップされず、実行されたままになります。

  1. ビルドする前に MSBuild でプロセスを強制終了することは可能ですか?

    また

  2. MSBuild にネイティブ DLL が存在しない場合、条件付きでプロジェクト B からプロジェクト A にネイティブ DLL をコピーすることは可能ですか? プロジェクト A の bin フォルダーは、それらが起動する場所であり、これはビルドが失敗する場所です (プロジェクト C から B へではありません)。

4

1 に答える 1

2

あなたの主な問題は、アプリケーションがそれ自体でクリーンアップされないことです。アプリケーションがプロセスを開始している場合は、終了時にプロセスを停止する必要があります。アプリケーションを閉じる前に、開始したすべてのプロセスで Process.Kill() を呼び出す必要があります。

そうは言っても、1) と 2) の両方が可能です。

1) Exec taskを使用して、msbuild から任意の実行可能ファイルを呼び出すことができます。このタスクを使用して、「taskkill」コマンドを呼び出すことができます。

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

2) msbuild コピー タスクには、ファイルが既存のファイルよりも新しい場合にのみファイルをコピーする "SkipUnchangedFiles" パラメーターがあります。

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