40

COM 相互運用機能を介して .NET API を公開する製品に取り組んでいます。ビルドの一部として、そのようなすべてのアセンブリの *.tlb ファイルを生成し、それらを個別の SDK パッケージの一部として提供します。お客様は、SDK を製品の上にインストールして、COM API を使用するアプリケーションを作成できます。

これらの *.tlb ファイルを出荷して、製品自体に登録する必要がありますか? *.tlb に対してコード化されたサードパーティ ライブラリが実行されるときに、実行時に *.tlb が必要になる状況はありますか?

はいと答える場合、どのように機能するのか説明してください。インターネット上で、配信して登録しなければならないというコメントをたくさん見ましたが、なぜ配信して登録しなければならないのかを明確に説明しているコメントは見つかりませんでした。それは私にそれが本当かどうか疑問に思いました。

4

2 に答える 2

41

はい、可能です。特に .NET の場合、クライアント コードがサーバーをどのように使用するかを予測できないため、タイプ ライブラリの登録を省略しないでください。

それらは特に一般的ではありませんが、次の 2 つのケースがあります。

  • クライアント コードが [ComVisible] メソッドを呼び出し、その呼び出しがアパートメントの境界を越える場合。アパートメントは、少しあいまいな COM の概念です。STA スレッドと MTA スレッドの違いを理解する必要があります。簡単に言うと、通常、別のスレッド、別のプロセス、または別のマシンから呼び出しが行われると、アパートメントの境界が交差します。COM は、呼び出しの引数を IPC パケットにシリアル化する方法を理解するための支援を必要としており、そのためには引数の型を知る必要があります。COM には Reflection の概念がないため、簡単に自動的に行うことはできません。プロキシとスタブを実装する別の DLL が必要です。ほとんどの場合、IDL ファイルから生成されます。.NET ではこれを実現するのは難しく、ほとんどの場合、Windows に組み込まれている標準のマーシャラーを使用する便利な 2 番目の方法を使用します。タイプライブラリを使用して、引数の型が何であるかを調べます。Regasm.exe /tlb オプションにより、インターフェイス プロキシ/スタブとタイプ ライブラリが登録され、標準マーシャラーがライブラリを見つけられるようになります。

  • パブリック インターフェイスで構造体を公開する場合。構造体は、相互運用シナリオでは非常に厄介です。構造体は、コンパイラの設定に大きく依存するレイアウトを持っています。同等の .NET プロパティは StructLayout.Pack です。.NET では 8 に固定されていますが、クライアント コードはそれを認識していません。構造体にアクセスするには、クライアント コードで IRecordInfo を使用する必要があります。これにより、構造体のすべてのフィールドがメモリ内のどこにあるかを見つけることができます。タイプ ライブラリは、IRecordInfo が必要とする情報を提供します。.NET で非常に簡単に実行できるように、構造体を完全に回避するのが最善です。

于 2013-01-09T21:19:20.983 に答える