相互運用機能を介して 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 のみ
ありがとう!