.NET アセンブリ/クラスをCOM 可視化できることが知られているため、アセンブリ内のクラスは、COM 対応クライアントによって COM オブジェクトとしてインスタンス化できます。
注意すべき「落とし穴」はありますか?
.NET アセンブリ/クラスをCOM 可視化できることが知られているため、アセンブリ内のクラスは、COM 対応クライアントによって COM オブジェクトとしてインスタンス化できます。
注意すべき「落とし穴」はありますか?
はい、はい、あります。
1) この種の相互運用性が必要となる特定のケースは、クラスが既存の COM インターフェイスを実装することが予想される場合です。たとえば、SharePoint は、カスタム インターフェイスを実装する COM クラスとしてプラグインが登録されるプラグイン アーキテクチャを提供します。
インターフェイスのPrimary Interop Assemblyがない場合は、TLB または TLB を含む DLL への参照を追加する必要があると思われます。参照を追加するときに [参照] を選択すると、Visual Studio で参照を追加できます。TLB がない場合は、を使用して TLB にコンパイルできる IDL が必要ですmidl.exe
。一部のドキュメントtlbimp.exe
では、TLB で実行し、生成されたアセンブリへの参照を追加することを同様に提案しています。
でも...
byte*
が に変換される場合がありますref byte
)。RemoteReadAt
) 。RemoteWriteAt
ReadAt
WriteAt
そのため、TLB から自動生成されたアセンブリを出発点として使用できますが、アセンブリを変更するか、生成されたコードをソース ファイルにコピーしてから、必要な変更を加えて、上記のすべてを修正する必要があります。
2)ドキュメントで推奨されているように、タイプとしてClassInterfaceAttribute
withを追加します。ClassInterfaceType.None
3) アーキテクチャのアセンブリをビルドし、Any CPU
それを登録する任意のマシンで -
C:\Windows\Microsoft .NET\Framework\<version>\regasm.exe
ます。C:\Windows\Microsoft .NET\Framework64\<version>\regasm.exe
ます。4) 実行しただけでregasm.exe
は .NET アセンブリが GAC に追加されないため、自分でアセンブリを GAC にインストールしない場合は、必ず/codebase
for パラメータを使用してください。regasm.exe
5) Visual Studio が管理者権限で実行されている場合でも、ビルド オプションの [COM 相互運用に登録する] チェックボックスをオンにすると、アセンブリの登録が失敗することがよくあります。チェックボックスをオフにして、代わりにregasm.exe
ビルド後のイベントとして追加することをお勧めします。
私が遭遇したカップル: