web-dev-qa-db-ja.com

Visual Studioでビルド中にプロジェクトのすべての依存関係を解決して含めるにはどうすればよいですか?

私は現在VS2010の下で、多くのプロジェクトと依存関係を持つ大規模なソリューションを持っています。それらのいくつかはGACにインストールされ、それらのいくつかは「lib」フォルダーから含まれています。ポータブルアプリと同様に、インストールプロセス(もちろん.NETランタイムを除く)なしで、未開発のコンピューターで実行できるように、プロジェクトの1つ(具体的にはWinFormsアプリ)を構築する必要があります。

これが機能するためには、EXEの出力フォルダーにすべての参照DLLとそれらの依存ツリー全体が必要です。プロパティウィンドウで「ローカルにコピー」への依存関係をマークすることで、exempleに対して実行できますが、これはEXEプロジェクトの直接参照に対してのみ機能するため、十分ではありません。もう1つの方法はセットアッププロジェクトを作成することですが、クライアントとそれを回避したいです(最終バージョンではClickOnceを使用します)。もちろん、すべてのDLLを手動で収集し、いつでも純粋に手動で実行できますが、それは非常に悪夢です。

ビルド中にVisual StudioでEXEの依存関係ツリー全体を収集し、それらを出力フォルダーにコピーするためのハックなど、ツール、msbuildトリック、コマンドラインオプションはありますか?すべてをまとめてクライアントに送信できるようにするためです。

21
Zoltán Tamási

私は実際に、次の方法でやや「中間」のソリューションを選択しました。

  1. 「ダミー」セットアッププロジェクトを作成しました。何も設定するのではなく、プロジェクトの出力(プライマリ出力、ローカライズされたリソース、コンテンツなど)を追加します。この方法では2分間のタスクでした。
  2. セットアッププロジェクトをビルドし、MSIファイルを出力として取得しました。
  3. MSIファイルの内容を、たとえば「MyAppPortable」と呼ばれる特定のフォルダーに抽出しました。私は解決策を見つけました こちら 。コマンドラインコマンドは

    msiexec/a "absolute_path_to_my_MSI_output"/qb TARGETDIR = "absolute_path_to_my_desired_output_folder"

  4. 解決済みの依存関係すべてを含む完全なアプリケーションを取得しました(遅延バインディングの依存関係を除くが、プロジェクトへの参照として追加することにより、手動で処理しました)。フォルダー全体をZip圧縮し、別のコンピューターに配置すれば、すべてうまくいきました。

1
Zoltán Tamási

基本的に、Visual Studioを使用して、すべてのソリューションのプロジェクトを同じ出力フォルダーにビルドし、このフォルダーをWindows Formアプリケーションフォルダー(アプリケーションEXEが存在する場所)として使用するように設定できます。

これを行うことにより、アプリが依存する可能性のあるすべてのアセンブリ参照を調整します。

VS 2012では、プロジェクトを右クリック=>プロパティ=>ビルドの選択(左ペイン)=>出力パスの設定:

Output path in VS 2012

ソリューションレベルのフォルダーをOutput pathとして選択します。

また、職場でこのような変更を行うことが禁止されている場合、次のような依存関係分析ツールを使用して、アプリが依存し、実行時に必要とする適切なアセンブリを調べて収集することをお勧めします。

更新:

上記のツールを使用しても、(実行時に)遅延バインドされたアセンブリ参照は生成されません。この場合、次を使用できます。 Fusion(アセンブリバインディングログビューア)

1
Yair Nevet

この質問からFody/Costuraの推奨事項を確認してください。 コンパイルされた実行可能ファイルにDLLを埋め込む

それは素晴らしい!同様のニーズで試してみたところ、数分も経たないうちに、同僚に簡単に渡すことができる完全に移植可能な(.Netフレームワークを除く)exeを手に入れました。

0
Matt Penner