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