Пишу "драйвер" для программы, драйвер взаимодействует с некоторыми устройствами по сети. У меня уже есть программное обеспечение C#, работающее с устройствами, поэтому я планирую повторно использовать код.
Таким образом, dll драйвера на самом деле представляет собой взаимодействие между программой и уже доступными сборками, она написана на C++/CLI. Программа вызывает методы, описанные в интерфейсе, dll взаимодействия вызывает код C#, как я это вижу.
Я реализую методы, которые будут вызываться программой, используя #pragma unmanaged
DeviceSearch::DeviceSearch(IDeviceSearchHandler* handler):m_handler(handler)
{
ManagedWrapper mw;
mw.Init();
}
Очевидно, что ManagedWrapper реализован в управляемом коде.
void ManagedWrapper::Init()
{
//some code
}
Однако здесь возникает проблема. Если Init() пуст или вызывает методы/классы, определенные в C++, он работает нормально. Однако, если я попытаюсь вызвать код C# (на который ссылается с помощью #using , где Facade.dll — это dll C#, которая выполняет некоторые функции), я получаю исключение нарушения прав доступа прямо при вызове mw.Init(), даже не внутри Это.
Я упускаю что-то действительно очевидное, что я должен сделать, чтобы взаимодействие работало? Большая часть информации в сети просто говорит, что это должно "просто работать"
Init
в частный вспомогательный метод. Если теперь Init запускается успешно и завершается сбоем при вызове вспомогательного метода, значит, один из используемых вами типов C# не прошел JIT. Если он по-прежнему терпит неудачу при вызове (почти пустого) методаInit
, значит, ваш собственный код повредил механизм выполнения .NET. - person Ben Voigt   schedule 06.05.2011