Мой вопрос: почему работает описанное ниже решение проблемы?Введение: у меня есть небольшое приложение на сервере c ++, которое выполняет свою бизнес-логику в c #Я использую DllExport для (обратного) пинвока.Все хорошо, все быстро, стабильно, без утечек или каких-либо проблем.C # состоит из нескольких сборок (все версии 4.7.2, x64 как собственные), но я сохраняю экспорт только в одной.
Проблема: одна часть разработки побудила меня вызвать тривиальную утилиту публичной статической функции издругая сборка, которая содержит только один файл с одним статическим классом с около 15 вспомогательными функциями и одним интерфейсом
public interface ISerializable
{
BinaryWriter serial(BinaryWriter w);
//ISerializable serial(BinaryReader w);//itself
}
Когда отладчик попадает в функцию, он сразу вызывает исключение нулевого указателя, а когда я нажимаю продолжить, он бросаетFatalExecutionEngineError.Исключение происходит при вызове функции, прежде чем что-либо еще произойдет.При взгляде на сборочный отладчик это происходит по инструкции CALL.Опять же, не было никаких проблем со стеком или чего-то необычного.
То, что я пробовал: будучи параноиком по поводу устранения ошибок с моей стороны, я создал чистый вызов pinvoke, который внутренне вызывал только простую тестовую функцию, ничего не делающую из того же класса,Он сразу разбился.Когда я переместил эту тестовую функцию в новый статический класс в той же сборке, она сработала ....
Что сработало: В отчаянии я переместил интерфейс в отдельный статический класс, и все начало работать.
Очевидно, это кодирование грузового культа, и я хотел бы понять, как отладить проблему.Как теоретически dllexport / pinvoke может вызвать эту ошибку?Кто-нибудь видел что-нибудь подобное?