вызов управляемого кода из неуправляемого кода

Я хочу вызвать свой .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)


посмотри GCHandle class и ключевое слово gcroot, которое предоставляет типизированную оболочку typesafe вокруг GCHandle.

вы можете использовать их для хранения ссылки на объект CLR (или коробочное значение) в собственном коде.

MSDN имеет базовый учебник здесь.


Я считаю, что вы ищете обратный PInvoke. Если вы google для обратного pinvoke вы получите много полезных записей. Я думаю, что у следующего есть хороший быстрый и грязный пример.

вызов PInvoke-обратный вызов PInvoke и как __stdcall - как __cdecl


ваш вызывающий код C++ с /clr включен. Правильно?

Если да, то вы можете просто использовать оператор using для использования вашей .NET dll в коде. Что-то вроде:

#using <Mydll.dll>

и тогда вы можете просто сделать объекты ваших управляемых классов, как:

MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();

Если вы хотите сделать этот obj членом данных вашего класса, использование gcroot-это путь.