在.NET中使用通过RaiseEvent调用的事件时,奇怪的行为

时间:2014-07-15 04:09:11

标签: .net multithreading com vb6 outlook-addin

我有一个用VB.NET编写的Outlook COM-Addin,但它可以使用一些传统的VB6库。

当我通过Outlook运行应用程序时,一切正常但是当.NET加载项库被加载到进程外(通过第三方应用程序调用)时,我遇到了一个我似乎无法看到的特定问题补救。

VB6库处理很多Outlook API工作,并在满足某些条件时将事件(通过RaiseEvent)激活回.NET。出于某种原因,当在进程外运行时,在一个特定实例中,一个特定事件只是SWALLOWED,并且简单地停止执行应用程序。没有冻结,因为.NET UI线程是响应的,但是一旦它进入VB6 RaiseEvent调用,底层代码路径就会停止冷却。

当我在调试器中走过时,我也会遇到相同的行为。我踏入事件(在VB6中)并且在另一边没有任何表面。

请注意,在执行应用程序之前,事件会在此之前成功触发一次或两次,因此它不是事件本身的批发问题,而只是调用RaiseEvent的一个特定实例。这太奇怪了。

对我来说,主要问题是没有错误。我通过各种错误处理预订了RaiseEvent调用 - 在VB6端和.NET上 - 并且引发了NOTHING。我在.NET中的事件处理程序的第一行上设置了跟踪日志,并且直接在VB6中的RaiseEvent调用之前和之后设置了跟踪日志,并且记录的唯一行是直接在RaiseEvent之前的行。

我能辨别的这个有问题的代码路径的唯一独特元素之一就是两个不同的事件相当快速地连续发出(其中第二个是失败的事件)。我尝试添加睡眠呼叫无济于事。

我只是不确定我可以做些什么来进一步诊断这个问题。我并没有明确地为VB6执行产生另一个线程,尽管我倾向于认为.NET处于幕后。

如果有人对我如何能够诊断出这个问题有任何建议,我会全神贯注,因为我刚刚用完了想法。

更新:问题在某种程度上与将一个ContactItem对象传递到VB6的第一个事件有关。我不需要整个对象,只需要一个属性,所以我发送了一个字符串来代替整个对象,确定它现在可以工作了。 .NET / COM有趣。

1 个答案:

答案 0 :(得分:0)

问题在某种程度上与将ContactItem对象传递到VB6的第一个事件有关。我不需要整个对象,只需要一个属性,所以我发送了一个字符串来代替整个对象,确定它现在可以工作了。 .NET / COM有趣。