在C#客户端中处理COM回调

时间:2012-04-04 00:21:18

标签: c# multithreading com callback interop

以下是应用程序的设计方法 - 我有一个COM服务器在某些条件下引发事件。 我有一个C#客户端UI,它应该处理这个C​​OM服务器引发的这些事件。

我的C#客户端中有一个委托,我将其传递给COM服务器并回调一个事件。我有一个自定义包装器,它将委托作为函数指针进行封送。像这样......

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

回调机制有效。 这里的问题是,一旦我得到回调,我应该调用COM服务器中的另一个方法来调用进一步的处理。

我无法从C#回调方法对COM组件进行第二次函数调用,它会破坏COM中的堆栈并返回异常。 我猜是这样的,因为回调不是创建COM对象的第一个调用的同一个线程。是否有可能解决这个问题?

一种选择是在C#客户端的事件回调中设置一个标志。在主线程的计时器上,检查标志,如果是,则进行第二次调用。但肯定有一种更优雅的方式来做这件事......任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

尝试更改Main()功能的线程属性。例如,如果您有:

[STAThread]
static void Main()

将其更改为:

[MTAThread]
static void Main()