2016-07-20 12 views
5

我有一些VB6代码需要慢慢转移到.NET。其中一些需要拨打网络。我正在从.NET DLL进行网络调用,当它完成时,它会触发一个事件。我在VB6中处理事件。现在,这在我的测试机器和大多数用户的机器上都能正常工作,但有些用户在事件被触发时会在程序中一致崩溃。如何在.NET中安全地运行异步代码和事件,以便VB6可以处理它?

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

我一直无法找到一个模式,哪些计算机有崩溃问题,哪些没有。

+2

是的,您必须在调用您的构造函数的线程上引发事件。你确实需要一个SynchronizationContext,你可以很容易地从Winforms表单中获得一个。一个就足够了,它不一定是可见的,只要阅读它的Handle属性就可以了。 –

+1

嗯我怎么会从VB6表单中获取?我不打开.NET中的任何窗体 – bzuillsmith

+2

您是否尝试过在可能的目标机器上分离和比较.Net框架?尽管微软声称在最近的.Net框架版本上完全向后兼容,但我发现不止一次,这个声明基本上是纯马屎。 – Stavm

回答

2

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

看来,如果你从主线程引发事件,一切都很好。但是,如果你触发事件异步只有两种方法可以让它不崩溃工作:

  1. 你可以把它带回主线程,可能是通过从形式的SynchronizationContext。
  2. 您可以从任何线程触发事件,并让它自动返回VB6的STA线程编组,但它需要额外的tlb信息,如果您只是在没有tlb选项的情况下注册DLL,它不在注册表中。如果您不通过任何设置SynchronizationContext的UI线程,此选项很不错。

请注意,如果您使用免费REG-COM,选项2需要在你的程序集清单的comInterfaceExternalProxyStub元素。请参阅question and answer here的示例

相关问题