将静态变量更改为非静态避免了异常

时间:2018-11-20 18:29:34

标签: c# vb6 com-interop

我正在尝试使用COM互操作从C#调用VB6方法时诊断崩溃。

关键是定义引用VB6对象的静态变量会导致崩溃; 但将其设置为非静态可避免此问题我不明白。

此错误是偶发性的-有时会发生,有时则不会发生,输入没有任何变化等。

我有点怀疑这可能与VB6 DLL线程模型有关,但是除了下面的详细信息外,几乎没有真正的证据。我什至不确定这与COM互操作是否100%相关,这似乎很可能。


类别Calc的VB6代码:

Function CalcSomething(ByVal input as Single)
   CalcSomething = ... <some math using 'input'>
End Function

'other functions exist also...

Calc对象没有内部状态;它只是功能的集合。


将崩溃的C#代码:

static class A
{
    private static Calc calc1 = new Calc();

    public GetCalc() => calc1;
}

...

A.GetCalc.CalcSomething(1234); // CRASH!

不会崩溃的C#代码:

static class A
{
    public GetCalc() => new Calc();
}

...

A.GetCalc.CalcSomething(1234); // NO CRASH.

其他详细信息:

错误:

  • 异常类型:System.AccessViolationException
  • 消息:“试图读取或写入受保护的内存”
  • 源:Interop.CalcDLL(这是自动生成的COM可调用包装器)

VB6 DLL:

  • 使用“公寓穿线”设置进行编译。

  • 该DLL中的类Calc被设置为GlobalMultiUse实例化。

  • DLL由C#项目注册和引用

因此,尽管我有解决方法,但我还是很想了解问题的根本原因是什么,因此可以避免和/或以更好的方式解决问题。

感谢您的输入!

0 个答案:

没有答案