1. ホーム
  2. .net

"COM Interopに登録" vs "アセンブリCOMを見えるようにする"

2023-10-06 07:45:09

質問

この2つのオプションの本当の違いは何ですか?私が知っているのは

COM Interop に登録する

このオプションは、アセンブリ上で regasm を実行し、アセンブリを COM コンポーネントとしてレジストリに登録し、すべての COM ライクなレジストリエントリに登録します。 このステップでは、TLB ファイルが生成されますか? 他に何が行われるのでしょうか?

プロジェクトをコンパイルするときに TLB が生成されるのを見ることがありますが、生成されないこともあります、これはなぜですか。

アセンブリCOMを見えるようにする

これはアセンブリにどのような効果をもたらすのでしょうか?このアセンブリの中に以下のような型がある場合、私の型がComVisibleとしてマークされていても、"Make assembly COM Visible"を指定する必要がありますか?

[GuidAttribute("02810C22-3FF2-4fc2-A7FD-5E103446DEB0"), ComVisible(true)]
public interface IMyInterface
{
}

どのように解決するのですか?

アセンブリCOMを表示する"は、大きなハンマーを使って すべて アセンブリ内のパブリック タイプを [COMVisible]にします。 まれに望ましいのは、あなたのスニペットで行ったように、可視化したい特定の型を選択することです。

アセンブリが構築された後、COMクライアントがそれを見つけ返すことができるように、登録する必要があります。 GUID は、作成したいオブジェクトを識別するための番号のみを使用し、どの DLL がそれを実装しているかを見つけるために余分なルックアップが必要です。 登録には HKLM\Software\Classes\CLSID\{guid} の部分にキーを書くことになります。 これを自分で行うには、レジストリの Regasm.exe /codebase /tlb を実行して自分で行うこともできますし、アセンブリをビルドした後に自動的に行うようビルドシステムに任せることもできます。

これは "Register for COM interop" が行うことです。 DLL の古いコピーが上書きされる前に自動的に登録解除され、レジストリの汚染を防ぐことができるので、これは望ましいことです。 VSは、レジストリキーへの書き込み権限を持つために昇格して実行する必要があり、これをオプションとした理由の1つです。 あるいは、ビルドサーバーではよくあることですが、登録したくないだけかもしれません。 より詳細な診断なしに、.tlb を取得できないことがある理由については、コメントできません。