Visual Studio は、いわゆる Interop-Library を生成します。これは、 と呼ばれるライブラリを参照している場合、 と呼ばれるMyCOMLib.dll
アセンブリが生成されることを意味しますMyComLib.Interop.dll
。このアセンブリには、.NET アプリケーションからインスタンス化する .NET ラッパー オブジェクト (いわゆるRuntime Callable Wrappers ) が含まれます。TlbImp.exeツールを使用して、この相互運用ライブラリを独自に生成できます。
したがって、実際にインスタンス化しているのは、実際の COM オブジェクトではなく、それらの COM オブジェクトのある種のプロキシとして機能する .NET オブジェクトです。内部的には、CoCreateInstance
またはCoCreateInstanceEx
COM クラス ファクトリを呼び出しています。また、これらのオブジェクトのメモリ処理も管理します。( を使用してこの管理に影響を与えることができますが、これは危険な場合があることに注意してMarshal.ReleaseComObject
ください)。
これは、アプリケーションが常にこれらの相互運用アセンブリと共に出荷されることを意味します。これらのアセンブリが存在しない場合 (およびProject Referencesを使用してそれらを参照した場合)、アプリケーションは実行されません (起動時に例外がスローされます)。アセンブリをアプリケーションのAppDomainにロードできる場合、interop タイプのオブジェクトを作成するまで問題はありません。RCW はCoCreateInstance
/CoCreateInstanceEx
を CLSID と共に呼び出します (相互運用アセンブリは TlbImp.exe ツールによって認識されます)。これらのクラス ID がレジストリ内に見つからない場合、アプリケーションは実行時例外をスローします。
ライブラリが存在するかどうかを確認する良い方法は、アプリケーションのセットアップ中に一意のライブラリ ID とバージョンを確認することです。それらはレジストリ内に保存されます。ライブラリの GUID とバージョンを知る必要がありますHKLM\Software\Classes\TypeLib\{Guid}\{Version}
。
最良の方法は、ライブラリを単独でインストールするサード パーティの再頒布可能パッケージと一緒にアプリケーションを配布することです。これにより、他のアプリケーションがサード パーティのタイプ ライブラリを削除しないようにすることもできます。これは、Microsoft が Visual C++ ライブラリまたは DirectX で行っている方法です。