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

StackOverflow https://stackoverflow.com/questions/225277

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хочу вызвать свой .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, то получите много полезных записей.Я думаю, что ниже приведен хороший быстрый и грязный пример.

PInvoke-Обратный PInvoke и __stdcall - __cdecl

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

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

#using <Mydll.dll>

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top