所以我在C#中编写一个组件,其中包含需要通过COM公开给VB6的事件。
我已经采取了列出的所有步骤here,并且事件本身正常。
然而,应用程序机制中的某些东西意味着有时COM事件未被传递(当多个事件连续触发时,只有第一个事件通过) 。我已经进入了跟踪数据之前的阶段,直到它在.net端被提升为事件并且在VB端被处理之后立即进行。它们不仅排队等候,或者不按顺序传送(会(更多)接受),它们被提出但没有收到。所有事件都是从同一个.net线程引发的。 当我单步执行代码时,它们都正确传递;在一个简单的测试应用程序中,他们甚至“快速”地交付。
因此VB应用程序的其他部分似乎阻止了这些事件的传递。我该在哪里开始寻找? DoEvent是否会出现意想不到的副作用,例如?
编辑:澄清了上述情况,只有批次中的第一批才能通过。
编辑:重述案例(原来是COM包装器被认为是问题)
答案 0 :(得分:2)
您的VB6代码最有可能在公寓中运行,因此必须运行消息泵来接受传入的事件。您的.Net对象将引发一个COM事件,这会向您的VB6内容发送一条消息并处理该消息。如果COM子系统正在使用SendMessageTimeout,则可能会丢弃引发的事件,因为您的VB6代码太慢而无法处理它们 - 但通常您会收到一个错误,抱怨如果某些内容被绑定,远程客户端将无法访问。 通常,在COM事件处理程序中执行绝对最小值是个好主意。这通常意味着举起您自己的活动或将自己的消息发布给自己。这是为了防止占用远程客户端线程。因此,我建议将事件处理程序限制为仅在VB6代码中定义的新事件上调用RaiseEvent。确保VB6的其余部分是面向事件的,它应该可以正常工作。
答案 1 :(得分:1)
所以经过6天的调试后,我得出了解决方案:当你在调试模式下处于断点时,COM事件只是分箱并且没有交付。我所看到的是两件事的组合:
希望这可以拯救别人在这样一个愚蠢的问题上浪费这么多时间......