2

相互運用機能を介して ActiveX DLL 内の COM オブジェクトのメソッドを呼び出す、単純な x86 ターゲット .NET 3.5 コンソール プログラムがあります。私のレジストリでは、ActiveX DLL に Apartment の ThreadingModel があります。.NET プログラムが STA スレッドで実行されている場合、すべて正常に動作します。MTA スレッドでは、COM メソッドの一部は正常に動作し、他のメソッドは次のようになります。

System.InvalidCastException: タイプ 'MyComTypeClass' の COM オブジェクトをインターフェイス タイプ '_MyComType' にキャストできません。IID '{[省略]}' を持つインターフェイスの COM コンポーネントでの QueryInterface 呼び出しが次のエラーにより失敗したため、この操作は失敗しました: タイプ ライブラリ/DLL の読み込み中にエラーが発生しました。(HRESULT からの例外: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))。

ActiveX DLL の ThreadingModel を Free または Both に切り替えると、.NET プログラムは MTA スレッドで動作しますが、ThreadingModel を Apartment に保持したいと考えています。

同じ ActiveX DLL と相互運用機能アセンブリを使用したこの同じ .NET プログラムは、両方のスレッド モデルを使用する複数の他のマシン (WinXP 32 ビット、Win7 64) で正常に動作します。例外は、1 台の PC (Win7 64) でのみ、MTA スレッドでのみ発生します。理由を知っている人はいますか?

3回目の魅力を願って、同様の質問が解決策なしで尋ねられました:

COM 例外 - TYPE_E_CANTLOADLIBRARY?

Windows 2003 x64 の別のスレッドで COM オブジェクトを使用する場合の TYPE_E_CANTLOADLIBRARY のみ

ありがとう!

4

1 に答える 1

3

MTA スレッドから STA オブジェクトを使用するには、マーシャリングが必要です。標準マーシャリングには、タイプ ライブラリが必要です。発生しているエラーは、タイプ ライブラリを読み込めなかったことを意味します。

したがって、タイプ ライブラリが正しく登録されていないと思います。DLL の登録解除と再登録を試すか、REGTLB.exe を使用してタイプ ライブラリを直接登録してみてください。

于 2012-05-15T21:44:08.767 に答える