2012-04-04 11 views
0

アプリケーションの設計方法を次に示します。 特定の条件でイベントを発生させるCOMサーバーがあります。 私はこのCOMサーバーによって発生したこれらのイベントを処理するはずのC#クライアントUIを持っています。C#クライアントでのCOMコールバックの処理

私のC#クライアントには、COMサーバーに渡すデリゲートがあり、イベントをコールバックします。デリゲートを関数ポインタとしてマーシャリングするカスタムラッパーがあります。そう...

 Fxn1inCOMWrapper([In, MarshalAs(UnmanagedType.FunctionPtr)] Client.SetStatusDelegate StatusCallback); 

コールバックメカニズムが機能します。 ここでの問題は、コールバックを取得すると、COMサーバーの別のメソッドを呼び出して処理を呼び出すことになります。

C#コールバックメソッドからCOMコンポーネントへの2回目の関数呼び出しを行うことができず、COMのスタックが破損し、例外が返されます。 コールバックがCOMオブジェクトが作成され、最初の呼び出しが行われた同じスレッドではないため、これが当てはまると思います。この問題を回避することは可能ですか?

1つのオプションは、C#クライアントのイベントコールバックでフラグを設定することでした。そして、メインスレッドのタイマーでフラグをチェックし、そうであれば2番目の呼び出しを行います。しかし、確かにこれを行うためのよりエレガントな方法でなければならない...誰も助けてくれる?

+1

これは、スレッドとは何の関係もありません、属性は何もしません。間違ったことを正確に診断する必要があります。 COMはイベントをサポートしているので、それらを使用したいかもしれません。 –

答えて

0

Main()関数のスレッド属性を変更してみてください。たとえば、あなたが持っている場合:へ

[STAThread] 
static void Main() 

変更、それは:

[MTAThread] 
static void Main() 
関連する問題