Я пытаюсь диагностировать сбой при вызове метода VB6 из C # с использованием COM-взаимодействия.
Главное, что определение статической переменной, ссылающейся на объект VB6, вызывает сбой; но нестатичность исключает проблему . Я не понимаю этого.
Эта ошибка была спорадической - иногда возникала, а иногда нет, без каких-либо изменений в входах,и т. д.
У меня есть смутное подозрение, что это может быть связано с моделью потоков VB6 DLL, но очень мало реальных доказательств этого, кроме подробностей ниже.Я даже не уверен, что это на 100% связано с COM-взаимодействием, просто кажется вероятным.
VB6-код для класса Calc
:
Function CalcSomething(ByVal input as Single)
CalcSomething = ... <some math using 'input'>
End Function
'other functions exist also...
A 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:
Скомпилировано с настройкой «Квартира с резьбой».
Класс Calc
в этой DLL установлен на GlobalMultiUse
экземпляр.
DLL зарегистрирована и на нее ссылается проект C #
Так что, хотя у меня есть обходной путь, мне бы очень хотелось понять, в чем причина проблемы,так что этого можно избежать и / или исправить лучше.
Спасибо за ваш вклад!