我如何在 .NET 中安全地 运行 异步代码和事件以便 VB6 可以处理它?

How do I safely run async code and events in .NET so VB6 can handle it?

我有一些 VB6 代码需要慢慢转移到 .NET。其中一些需要调用网络。我正在从 .NET dll 进行网络调用,完成后会触发一个事件。我在 VB6 中处理事件。现在这在我的测试机器和大多数用户的机器上运行良好,但一些用户在事件被触发时的某个时候会遇到程序持续崩溃。

我认为这是一个线程问题。那么我应该如何处理 .NET 方面的线程呢?调用 .NET 代码时没有同步上下文,我认为这可能是问题所在。我如何将异步操作返回到 VB6 调用线程?我的 VB6 代码是 STA,我读到内容会通过 COM 自动编组到 VB6 线程,但也许这是错误的?如果确实是线程问题,我不完全明白该怎么办。

我一直无法找到计算机出现崩溃问题而哪些计算机没有崩溃的模式。

所以我后来发现我被误导了,除了少数开发人员的机器外,它几乎不能在所有用户的机器上工作。问题是 .tlb 文件没有生成和注册。

看来如果你从主线程触发事件,一切都很好。但是,如果您异步触发事件,则只有两种方法可以使其在不崩溃的情况下运行:

  1. 您可以将它带回主线程,或许可以通过表单中的 SynchronizationContext。
  2. 您可以从任何线程触发事件并让它自动编组回 VB6 的 STA 线程,但是如果您只注册没有 tlb 选项的 DLL,它需要额外的 tlb 信息,而这些信息不在注册表中。如果您不通过任何设置 SynchronizationContext 的 UI 线程,此选项很好。

请注意,如果您使用的是无注册 COM,则选项 2 需要程序集清单中的 comInterfaceExternalProxyStub 元素。有关

的示例,请参见 question and answer here