COM オブジェクト SerInterface objCANinterface; があります。これは VC++ 6.0 ATL で作成され、C# GUI からメソッドを正常に呼び出すことができました (レジストリでチェックすると、ThreadingModel は両方です)。
しかし、このスレッド内で開かれたこのオブジェクトを使用してプロセスを続行する必要があるスレッドを作成しました。
そのため、コンストラクタークラスに次のステートメントを追加しました
public MyClass()
{
// Start the thread with a ParameterizedThreadStart.
ParameterizedThreadStart start = new ParameterizedThreadStart(callBackLoad);
threadFlash = new Thread(start);
threadFlash.SetApartmentState(ApartmentState.STA);
...
}
void myFun()
{
threadFlash.Start(objCANinterface);
threadFlash.Join(); //Wai
}
[STAThread]
public void callBackLoad(object refinterface)
{
//I am not able to access objCANinterface inside my thread so i have passed the object as a parameter and trying to cast
SerInterface objSrinterface = (SerInterface)refinterface;
}
これは成功しません。この問題の解決方法を教えてください。次のエラーが表示されます
MyClass.exe で、タイプ 'System.InvalidCastException' の未処理の例外が発生しました
追加情報: タイプ 'System.__ComObject' の COM オブジェクトをインターフェイス タイプ 'MYINTERFACELib.SerInterface' にキャストできません。この操作は、IID '{37C34F3C-0082-46F5-9974-37CEB2E1C2EE}' を持つインターフェイスの COM コンポーネントでの QueryInterface 呼び出しが次のエラーにより失敗したため、失敗しました: タイプ ライブラリ/DLL の読み込み中にエラーが発生しました。(HRESULT からの例外: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))。
この問題を解決する方法を教えてください。前もって感謝します。
@ oberfreak........「as」も使ってみましたか?デバッガーでステップダウンする場合、それはどのタイプですか、それは予想されるタイプですか? 相互運用機能はアセンブリに含まれていますか、それとも別のファイルに含まれていますか?
@ oberfreak、「As」の使い方を教えてください。私の相互運用機能は、exe と共に含まれています。スレッドから完全に作業することができました。
@ Hans Passant: タイプ ライブラリを .rgs スクリプトに登録するのを忘れており、プロキシ/スタブ プロジェクトも作成していません。Both のスレッド モデルでは、オブジェクトが STA スレッドで作成され、別の STA スレッドで使用されるときに、オブジェクトをマーシャリングする必要があります。これは、新しいスレッドを作成することを無意味にする傾向があります。代わりに、ワーカー スレッドでオブジェクトを作成して先に進みます。
@ Hans Passant : C# で作成したタイプ ライブラリと相互運用機能を登録しました。これにより、C# コード内で使用できるようになりました。CAN シーケンス コマンドを続行するには同じオブジェクトを使用する必要があるため、新しいオブジェクトを作成できません。スレッド内でのマーシャリングを改善するためのサンプルを提供してください。