Изменение статической переменной на нестатическую исключает исключение - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь диагностировать сбой при вызове метода 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 #

Так что, хотя у меня есть обходной путь, мне бы очень хотелось понять, в чем причина проблемы,так что этого можно избежать и / или исправить лучше.

Спасибо за ваш вклад!

...