0

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

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

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

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

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

1つのオプションは、C#クライアントのイベントコールバックにフラグを設定することでした。そして、メインスレッドからのタイマーで、フラグを確認し、はいの場合は2回目の呼び出しを行います。しかし、これを行うには確かにもっとエレガントな方法が必要です...誰か助けてくれませんか?

4

1 に答える 1

0

関数のスレッド属性を変更してみてくださいMain()。たとえば、次の場合:

[STAThread]
static void Main()

次のように変更します。

[MTAThread]
static void Main()
于 2012-04-04T00:42:48.383 に答える