ошибка при вызове управляемого кода из неуправляемого в C++/CLI

Пишу "драйвер" для программы, драйвер взаимодействует с некоторыми устройствами по сети. У меня уже есть программное обеспечение 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(), даже не внутри Это.

Я упускаю что-то действительно очевидное, что я должен сделать, чтобы взаимодействие работало? Большая часть информации в сети просто говорит, что это должно "просто работать"


person nnevod    schedule 06.05.2011    source источник
comment
(1) Убедитесь, что отладка в смешанном режиме включена. (2) Переместите весь код внутри Init в частный вспомогательный метод. Если теперь Init запускается успешно и завершается сбоем при вызове вспомогательного метода, значит, один из используемых вами типов C# не прошел JIT. Если он по-прежнему терпит неудачу при вызове (почти пустого) метода Init, значит, ваш собственный код повредил механизм выполнения .NET.   -  person Ben Voigt    schedule 06.05.2011
comment
Это все еще терпит неудачу. Я также реализовал решение, описанное в ответе, но все тот же сбой. Как диагностировать коррупцию и избавиться от нее? Или лучше использовать другой метод взаимодействия?   -  person nnevod    schedule 10.05.2011


Ответы (1)


Посмотрите, поможет ли это:

Согласно Как я могу использовать dll С# в проект Win32 C++?

«Определите класс абстрактного интерфейса в собственном коде C++, затем создайте конкретный подкласс внутри управляемой DLL C++. Вызовите свои объекты C# в реализациях методов.

Наконец, экспортируйте фабричную функцию, которая создаст экземпляр класса реализации и вернет указатель базового класса, который может использовать ваш собственный код».

person wengseng    schedule 06.05.2011