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

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