2017-02-08 3 views
1

私はC#Webサービスで使用されている従来のC++コンポーネントを開発中です。 C#プロジェクト参照は有効ですが、実行時にCOMオブジェクトが作成されたときに "CLSID参照に失敗しました"という例外がスローされました。 CLSID解決が機能するためには、DLLがある場所へのルートパスが必要でした。InProcServer32キーがDLLへのフルパスを定義するときに、PATH環境変数にCOM DLLへのパスが必要なのはなぜですか?

CLSIDルックアップを動作させるには、PATH環境変数にDLLのパスを指定する必要があるのはなぜですか?

+0

COMオブジェクトが正しく登録されていない可能性があります。パスはCLSIDルックアップには影響しません。おそらくC#プロジェクトで実際のエラー –

+0

@ M.Mに対応しないエラーメッセージが表示されます。登録無料のCOMである可能性があります。私はnewfangledものを使ったことはありませんが、実行可能ファイルのディレクトリにない場合、パスルックアップを介して見つかったDLLに依存しなければならないと思います。 –

+0

私はチェックして、DLLが正しく登録されています。 DLLが存在するフォルダへのパスを追加した後、Procmon.exeを実行し、CLSIDのレジストリ検索が成功したことを確認しました。その後、PATH環境変数からDLLパスを削除し、同じCLSIDルックアップが失敗するのを発見しました。 'Depends.exe'は、問題のDLLが同じフォルダ内の他のDLLに依存していることを示しており、パスがPATH環境変数になければならない理由がわかりました。 Id 'はむしろそれを仮定するよりも確かです。 – cg0x1

答えて

0

私はその理由を見つけました。 C#WebサービスはIISでホストされ、着信呼び出しがディスパッチされると、IISはWebサービスの "\ bin"フォルダにあるDLLを調べます。 COMコンポーネントはプロジェクト参照ファイルなので、ディスク上の物理ファイルは実際のDLLではなくランタイム呼び出し可能ラッパーです。 DLLにパスをPATH環境変数に追加すると、IISはCOM DLLを見つけて問題を解決することができます。

関連する問題