Вызов управляемого кода из неуправляемого кода
Я хочу вызвать свой код .NET из неуправляемого С++. Моя точка входа в процесс основана на .NET, поэтому мне не нужно беспокоиться о размещении CLR. Я знаю, что это можно сделать с помощью COM-обертки для объектов .NET, но я хотел бы получить доступ к отдельным статическим методам управляемых классов, поэтому COM-это не мой самый короткий/простой маршрут.
Спасибо!
Ответы
Ответ 1
Предполагая, что вы говорите о реальном неуправляемом коде - не только собственный С++, запущенный в сборке смешанного режима, скомпилированном с /clr - самый простой способ - создать оболочку для вашего .NET-кода в С++/CLI. Затем вы можете экспортировать методы С++/CLI, просто пометив их __declspec (dllexport).
В качестве альтернативы, если у вас есть контроль над вызовом неуправляемого кода, вы можете маршализовать указатели функций на ваши методы .NET и передать их неуправляемому коду.
Ответ 2
Посмотрите на это решение:
https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports
Решение позволяет вызвать функцию С# из C, украсив вашу функцию атрибутом [DllExport] (напротив P/Invoke DllImport).
Exmaple:
Код С#
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, который генерируется при компиляции вашего кода на С# (https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396)
Ответ 3
Взгляните на класс GCHandle и ключевое слово gcroot, которое предоставляет шаблонную шаблонную оболочку вокруг GCHandle.
Вы можете использовать их для хранения ссылки на объект CLR (или значение в коробке) в собственном коде.
В MSDN есть базовый учебник здесь.
Ответ 4
Я считаю, что вы ищете Reverse PInvoke. Если вы google для обратного pinvoke, вы получите много полезных записей. Я думаю, что следующее имеет хороший быстрый и грязный пример.
PInvoke-Reverse PInvoke и __stdcall - __cdecl
Ответ 5
Ваш код вызова - С++ с включенным /clr. Правильно?
Если да, то вы можете просто использовать оператор using для использования вашей DLL.NET в своем коде. Что-то вроде:
#using <Mydll.dll>
а затем вы можете просто сделать объекты ваших управляемых классов такими:
MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();
Если вы хотите сделать этот объект членом данных вашего класса, использование gcroot - это путь.