web-dev-qa-db-ja.com

Visual StudioでDLLの依存関係をコピーする

Visual Studioでプロジェクトを設定して、プロジェクトの参照の1つが依存するサードパーティDLLをコピーするにはどうすればよいですか?

メインアプリケーションプロジェクトとクラスライブラリDLLがあります。メインアプリケーションはクラスライブラリDLLを参照し、DLL自体はいくつかのサードパーティDLLを参照します。メインアプリケーションをコンパイルすると、クラスライブラリDLLがその出力ディレクトリに自動的にコピーされますが、サードパーティのDLLはコピーされません。

メインアプリケーションはそれらを使用せず、クラスライブラリでのみ使用されるため、メインアプリケーションプロジェクトからサードパーティDLLへの参照を追加しません。

62
M. Dudley

これは、プロジェクトプロパティウィンドウで実現できます。 Visual Studioでは、ビルドの前、または後に発生するイベントを定義できます。プロジェクトプロパティウィンドウを表示するには、ソリューションエクスプローラーウィンドウでプロジェクトを右クリックし、[プロパティ]をクリックします。左側から「ビルドイベント」タブに移動します。

ビルド後のボックスに、いくつかのコピーコマンドを入力します。例えば:

_copy "$(SolutionDir)mydll.dll" "$(TargetDir)"
_

$(SolutionDir)$(TargetDir)は両方とも事前定義変数です。標準の構文は次のとおりです。

_copy "source directory and file name" "destination directory"
_

[ビルド後の編集...]ボタンをクリックすると、挿入可能なこれらの事前定義変数のリストを含むボックスが表示されます($(SolutionDir)$(TargetDir)など)

サイドノートとして、これは、カスタム構成ファイル、画像、またはプロジェクトにある他の依存関係など、他のファイルをコピーするための便利なプロセスです。

37
Brian

次のフラグメントは私のために機能します:

<Project>
  ...
  <ItemGroup>
    <Content Include="Path\to\dll\dllname.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  ...
</Project>

これはC#で機能します。ネイティブC++の場合は、dllを出力フォルダーにコピーしますが、この依存関係はVisual Studioには表示されません。プロジェクトファイルで直接編集する必要があります。

自明ではない例をテストするために、ネイティブC++プロジェクトBに依存するC#プロジェクトAを実行しようとしました。Bプロジェクトは、サードパーティのネイティブDLL Cに依存します。 Aをビルドすると、Cがバイナリフォルダーにコピーされます。

Visual Studio 2010で試しました。

23
sergtk

Alex Yakuninが提供するこのソリューションをご覧ください http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html 本当にうまくいきました- DevExpressライブラリが明示的に使用されているシナリオには、展開時に問題を引き起こす他の依存関係がありました)

  • 注1:Visual Studio 2010は、参照されたdllを自動的に追加するようですが、msbuildは追加しませんでした。リリーススクリプトがmsbuildを使用していたため、Alexのソリューションは機能しました。
  • 注2:また、参照されたライブラリ(コードで参照されたライブラリ)の場合、ソリューションエクスプローラーがそうであったとしても、csprojでcopy-localが実際にTrueに設定されていることを確認する必要がありました。最良の方法は、copy-local = False、保存を設定し、copy-local = True、保存を設定することです。

これらの2つのステップ-参照ライブラリのcopy-local = trueおよび間接参照のmsbuildターゲットの追加により、ビルドのセットアップが自動化されました。

6
Anuroopa Shenoy

依存関係ファイルをプロジェクトのルートフォルダーではなく、サブフォルダーに配置したいのです。ただし、ファイルはビルドフォルダーのルートフォルダーに配置する必要があります。

私のビルドイベントは次のようになります。

enter image description here

enter image description here

enter image description here

 Command: call xcopy /S /Y "$(SolutionDir)Dependencies\*.*" "$(TargetDir)"

私のように「依存関係」にもサブフォルダーが含まれている場合。

2
MrCalvin

これはお勧めしません。コピーされている(および潜在的に、再構築されている)アセンブリの数がN ^ 2爆発することになります。可能であれば、すべてのプロジェクトでアセンブリを同じ$(OutDir)に配置する必要があります。 TFSを使用している場合、チームビルドがこれを行います。

2
Richard Berg

クラスライブラリリファレンスへのメインアプリケーション、referencesに移動します。

「ローカルコピー」をTrueに設定します。

これで、クラスライブラリのbinディレクトリがメインアプリケーションのbinディレクトリにコピーされます。サブ依存のサードパーティDLLを含みます。

2
Curtis Yallop