2009-05-11 16 views
2

レガシーCOMオブジェクトの周りにラッパーを作成し、GACにラッパーをインストールしようとしています。目標は、コンポーネントが必要とする特定の構成情報の設定を自動化し、使用するすべてのアプリケーションに共通の強く型付けされたインタフェースを作成することです。Com InteropアセンブリからCOM DLLパスを検索します。

これまでのところ私の解決策は、元のCOM DLLと同じディレクトリにXML構成ファイルを保存し、クラスコンストラクターに構成をロードすることです。残念ながら、私は登録されたCOM dllの場所を見つけることができませんでした。

COMオブジェクトの相互運用機能DLLによって参照されるCOM DLLの完全なファイルパスを取得するにはどうすればよいですか?

答えて

2

それぞれのCOMサーバーからオブジェクトを作成したら、そのDLLが読み込まれている必要があります。基になるCOMサーバーが "mycomserver.dll"に実装されていると仮定すると、P/Invokeを使用してDLLのパスを示すGetModuleHandle( "mycomserver.dll")を呼び出すことができます。

+0

COMサーバーがDLLでインプリメントされ、in-procでロードされたと仮定すると... –

2

おそらく、COM DLLのCLSIDとIIDの値にマップされるinterop DLLからGuidAttributeまたはの値を取得する可能性があります。その後、レジストリ内の適切なDLLパスを調べることができます。

+2

REGパス: HKEY_LOCAL_MACHINE \ソフトウェア\クラス\ CLSIDの\ {GUID-ここで-XXXX-XXXXXXXX} – Cheeso

+0

私はこのコンポーネントをadvertiesed(MSI)のために動作しません推測する - それは、このようにかなり脆い溶液です。 –

+0

.NETのシナリオでは、まだインストールされていないもののパスを見つけることは非常に難しいことから、そのために脆いのか分かりません。 –

1

あなたはCOMのDLLのCLSIDを知っていればHKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component}またはHKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component}(64ビットマシンに登録WOW6432NODE => 32ビットCOM)上のCLSIDを持つキーがある場合、あなたは確認することができ

の場合キーがある場合は、COMコンポーネントが登録されていることを意味します。次に、サブキーの内部のデフォルト値を確認します。InprocServer32

  • HKEY_CLASSES_ROOT\CLSID\{12345678-9012-3456-7890-123456789012}\InprocServer32
  • HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{12345678-9012-3456-7890-123456789012}\InprocServer32

(あなただけInprocServer32の値をチェックする必要があると思います)C#を使用してこれらのキーを開く方法の参考例であるここでは、助けている場合:How to check COM dll is registered or not with C#?

-1

AddInクラスをそのまま反映しています。

var t = typeof(ThisAddIn); 
var path = t.Assembly.CodeBase; 
関連する問題