我正在尝试使用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#项目注册和引用
因此,尽管我有解决方法,但我还是很想了解问题的根本原因是什么,因此可以避免和/或以更好的方式解决问题。
感谢您的输入!