21

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

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

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

4

3 に答える 3

1

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

  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 して別のコンピューターに置くと、すべてが正常に機能しました。

于 2013-07-05T09:52:12.317 に答える
1

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

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

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

VS 2012 の出力パス

出力パスとしてソリューション レベルのフォルダーを選択します。

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

アップデート:

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

于 2013-07-05T00:14:39.560 に答える
0

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

それは素晴らしい!同様のニーズに合わせて試してみたところ、数分もかからずに、同僚に簡単に提供できる完全に移植可能な (.Net フレームワークを除く) exe が作成されました。

于 2014-12-12T02:05:00.460 に答える