вызов управляемого кода из неуправляемого кода
Вопрос
Я хочу вызвать свой .NET-код из неуправляемого C ++.Моя точка входа в процесс основана на .NET, поэтому мне не нужно беспокоиться о размещении среды CLR.Я знаю, что это можно сделать с помощью COM-оболочек для объектов .NET, но я хотел бы получить доступ к отдельным статическим методам управляемых классов, поэтому COM - не самый короткий и простой путь для меня.
Спасибо!
Решение
Предполагая, что вы говорите о реальном неуправляемом коде - не просто о родном C ++, работающем в сборке смешанного режима, скомпилированной с / clr, - самый простой способ - создать оболочку для вашего .ЧИСТЫЙ код на C ++ / CLI.Затем вы можете экспортировать методы C ++ / CLI, просто пометив их __declspec(dllexport).
В качестве альтернативы, если у вас есть контроль над вызовом неуправляемого кода, вы можете маршалировать указатели на функции к вашим методам .NET и передавать их в неуправляемый код.
Другие советы
Посмотрите на это решение:https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports Решение позволяет вызывать функцию C # из C, украсив вашу функцию атрибутом [DllExport] (противоположным P / Invoke DllImport).
Примерная карта:
Код на C #
class Test
{
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
C - код:
extern "C" int add(int, int);
int main()
{
int z = add(5,10);
printf("The solution is found!!! Z is %i",z);
return 0;
}
Выходной сигнал:
The solution is found!!! Z is 15
Обновить:В комментариях есть вопрос и хороший ответ:
Как мне включить dll в неуправляемый проект?
Вы должны ссылаться на .lib-файл, который создается при компиляции вашего кода на C # (https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396)
Взгляните на GCHandle ( Ручка ) class и ключевое слово gcroot, которое предоставляет типизированную шаблонную оболочку вокруг GCHandle.
Вы можете использовать их для хранения ссылки на объект CLR (или значение в штучной упаковке) в машинном коде.
В MSDN есть базовый учебник здесь.
Я полагаю, вы ищете Обратный PInvoke.Если вы загуглите обратный pinvoke, то получите много полезных записей.Я думаю, что ниже приведен хороший быстрый и грязный пример.
Ваш вызывающий код - C ++ с включенным /clr.Верно?
Если да, то вы можете просто использовать инструкцию using для использования вашей .NET dll в своем коде.Что - то вроде:
#using <Mydll.dll>
и тогда вы можете просто создать объекты ваших управляемых классов, такие как:
MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();
Если вы хотите сделать этот объект obj членом данных вашего класса, то лучше всего использовать gcroot.