2

msbuild プロジェクトのすべての参照とディスク上のそれらの場所を一覧表示しようとしています。

これまでのところ、プロジェクト参照とアセンブリ参照は問題なく取得できますが、COM 参照に問題があります。これは、プロジェクト ファイル内のほとんどの参照がどのように見えるかです。

<COMReference Include="[name of assembly]">
  <Guid>{GUID-GOES-HERE}</Guid>
  <VersionMajor>1</VersionMajor>
  <VersionMinor>0</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>primary</WrapperTool>
  <Isolated>False</Isolated>
  <EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>

COM DLL へのパスを取得する方法がまったくわかりません。少しグーグルで調べたところHKEY_CLASSES_ROOT\CLSID\{GUID-FOUND-IN-PROJECT-FILE}\InprocServer32、キーのデフォルト値を見て取得できることがわかりました。regedit を使用してレジストリを調べると、正しいように見えますが、C# でこれを行うたびに、レジストリ キーは常に null です。私もWow6432Node\CLSID同じ結果で下を見ました。

グーグルは、msbuildResolveComReferenceタスクと、Microsoft.Build名前空間を使用してプログラムでmsbuild(ResolveComReference class)を使用する方法をさらに見つけましたが、単一のタスクを実行する代わりに、この名前空間を使用してプロジェクト全体をビルドする方法しか見つけられませんでした。

プロジェクト ファイルの情報を使用して COM DLL の場所を取得するにはどうすればよいですか?

編集

これを行う理由は、ビルド プロセスを自動化するためです。一方では、これにより、COM DLL をインストーラーに含めることができます (WiX の Heat ツールまたは John Robbin の Paraffin ツールを使用)。一方で、msbuild で発生した問題を回避できます。msbuild にすべての依存関係を解決させます。Project1 と Project2 の両方が同じ COM DLL を参照し、Project1 が Project2 を参照する場合、COM DLL を 2 回追加しようとするため、クラッシュします。

4

1 に答える 1

6

これを行う理由は、ビルド プロセスを自動化するためです。

それは間違いなく問題の一部です。A<COMReference>は、ビルドを実行するマシンに COM サーバーがインストールされている場合にのみ便利です。別のマシンでビルドを再現したい場合、これは問題になります。そのマシンに適切な COM サーバーがインストールされていない可能性が大幅に高くなります。レジストリに戻って見つからない理由は確かに説明されています。

どのマシンでもビルドを再現できるようにするには、ビルドの依存関係を断ち切ることが重要になります。これを行うには、Tlbimp.exe を実行してインポート ライブラリを作成します。そして、ソース管理にチェックインします。また、生成された DLL に通常のアセンブリ参照を追加して、ファイルの依存関係を単純にするだけです。

欠点は、依存関係が凍結され、COM サーバーが進化しているときに問題が発生することです。ボイラープレートは、サーバーのバージョンが変更されたときに {guid} が変更されることです。これは、DLL Hell を回避するために必要です。その場合は、ビルドを実行するすべてのマシンで COM サーバーの更新が確実に登録されるようにする手順が必要になります。COM 依存関係があるということは、常に展開依存関係があることを意味するため、実際にはそれほど問題にはなりません。また、サーバーがユーザーのマシンで利用可能であることを確認する必要があります。それは常に大したことであり、軽薄にバージョンを変更することはほとんどありません。

于 2013-06-23T17:22:27.483 に答える