何らかの理由で、ベータ テスター用に、コンパイル済みアセンブリ、構成ファイル、およびその他のさまざまなファイルをネットワーク共有に XCOPY するためのバッチ ファイルを作成するスクリプトがあります。インストーラーはありますが、インストーラーを実行するために必要な権限を持っていないものや、Citrix で実行しているものがあります。
XCOPY と Citrix についての言及でデスク全体に嘔吐した場合は、それを言い訳にして早く家に帰りましょう。どういたしまして。
コードには現在、次のような数百の行があります。
CreateScripts(basePath, "Client", outputDir, FileType.EXE | FileType.DLL | FileType.XML | FileType.CONFIG);
以前は、そのファイル タイプを出力ディレクトリにコピーするかどうかを表す 20 個の int パラメータ (ファイル タイプごとに 1 つ) があり、さらに悪化していました。
これらの数百の行は、数千の XCOPY 行を含むアップロード/ダウンロード バッチ ファイルを作成します。セットアップ プロジェクトでは、「クライアントからのプライマリ出力」や「クライアントからのコンテンツ ファイル」などを参照できます。セットアップ以外のプロジェクトからプログラムでそれを実行できるようにしたいのですが、途方に暮れています。
明らかに、MS は、API を使用するか、.csproj ファイルを解析することによってそれを行います。どうすればこれを行うことができますか?セットアップ カテゴリのいずれかのファイルのリストを取得する方法を探しています。
- プライマリ出力
- ローカライズされたリソース
- コンテンツ ファイル
- ドキュメント ファイル
編集:私はハスが提案したようなセットアッププロジェクトを持っています。それは私が探しているものの途中です。それが完璧な解決策ではない唯一の問題は、複数のプロジェクトが同じアセンブリが独自のフォルダーにあることに依存しており、セットアップでファイルが一度しかコピーされないことです。
例:
プロジェクト Admin、Client、および Server はすべて ExceptionHandler.dll に依存し、Admin と Client は両方とも Util.dll に依存しますが、Server は依存しません。これは私が探しているものです:
- 管理者
- 管理者.exe
- Admin.exe.config
- ExceptionHandler.dll
- ユーティリティ.dll
- クライアント
- クライアント.exe
- Client.exe.config
- ExceptionHandler.dll
- ユーティリティ.dll
- サーバ
- サーバー.exe
- Server.exe.config
- ExceptionHandler.dll
参照されているアセンブリはすべて同じであるため、次のようになります。
- 管理者
- 管理者.exe
- Admin.exe.config
- ExceptionHandler.dll
- ユーティリティ.dll
- クライアント
- クライアント.exe
- Client.exe.config
- サーバ
- サーバー.exe
- Server.exe.config
これにより、クライアントまたはサーバーのいずれかが期待する 2 つの DLL のいずれかを見つけることができない場合、FileNotFoundException が発生します。
別のプロジェクトの出力で別の場所に複製されている場合でも、常に出力をコピーするようにするために欠落しているセットアップ プロパティはありますか?
EDIT AGAIN : 参照されるすべての DLL は「ローカルにコピー」に設定され、常に設定されています。NAnt と XSLT を使用してファイルのリストを取得することに関する適切な記事を見つけたので、neouser99 が提案したように、それも解決策になる可能性があります。
受け入れられた解決策: 私はほとんど出発点に戻っています。すべての .exe および .dll の出力は、セットアップ プロジェクトの "bin" ディレクトリに緩やかに圧縮されて配置されます。他のアプリケーションごとのフォルダーには、そのディレクトリ内の実行可能ファイルへのショートカットが含まれています。
ここでの違いは、カスタム アクションをインストーラーに追加してリフレクションを使用し、各実行可能出力の依存関係を列挙し、.exe ファイルと .dll ファイルを別のディレクトリにコピーすることです。いくつかのセットアップライブラリを介して含まれるファイルをプログラムで検出する方法があると思っていたので、少し面倒です。