вызов управляемого кода из неуправляемого кода - PullRequest
16 голосов
/ 22 октября 2008

Я хочу вызвать мой код .NET из неуправляемого C ++. Моя точка входа в процесс основана на .NET, поэтому мне не нужно беспокоиться о размещении CLR. Я знаю, что это можно сделать с помощью оболочек COM для объектов .NET, но я хотел бы получить доступ к отдельным статическим методам управляемых классов, поэтому COM не является моим самым коротким / простым способом.

Спасибо!

Ответы [ 5 ]

18 голосов
/ 23 июля 2011

Посмотрите на это решение: 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)

6 голосов
/ 22 октября 2008

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

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

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

6 голосов
/ 22 октября 2008

Предполагая, что вы говорите о реальном неуправляемом коде - не только о собственном C ++, работающем в сборке смешанного режима, скомпилированной с / clr, - самый простой способ - создать оболочку для вашего кода .NET в C ++ / CLI. Затем вы можете экспортировать методы C ++ / CLI, просто пометив их __declspec (dllexport).

В качестве альтернативы, если у вас есть контроль над вызовом неуправляемого кода, вы можете упорядочить указатели функций для ваших методов .NET и передать их в неуправляемый код.

3 голосов
/ 30 октября 2008

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

PInvoke-Reverse PInvoke и __stdcall - __cdecl

1 голос
/ 22 октября 2008

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

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

#using <Mydll.dll>

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

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

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

...