Вызов C # из C - PullRequest
       33

Вызов C # из C

24 голосов
/ 13 декабря 2010

Кто-нибудь работал над вызовом модуля C # из модуля C.Я пытался искать в Интернете, но не нашел хороших примеров.Хотя многие сайты говорят что-то вроде использования COM-взаимодействия, но не могут найти подходящий пример или статью, объясняющую это.

Если кто-то может помочь мне в этом, было бы здорово

Спасибо, Sveerap

Ответы [ 3 ]

24 голосов
/ 13 декабря 2010

Существует больше, чем просто COM-взаимодействие, если вы хотите вызвать управляемый код из C или C ++.Ниже перечислены также менее известные методы (взяты из MSDN FAQ ):

Как вызвать сборку .NET из собственного VisualC ++?

Существует четыре основных способа вызова сборки .NET из собственного кода VC ++:

  1. API хостинга CLR : собственный VC ++модуль вызывает API хостинга CLR для размещения CLR, загрузки и вызова сборки .NET (пример кода: CppHostCLR ).

  2. COM Interop : Если сборка .NET может быть представлена ​​как компонент COM, собственный модуль VC ++ может вызывать сборку .NET через взаимодействие .NET - COM (пример кода: CppCOMClient ).

  3. Reverse PInvoke : управляемый код вызывает собственный код, передавая делегату, который может вызывать собственный код (пример кода: CSPInvokeDll ).

  4. C ++ / CLI : если модулю, содержащему собственный код VC ++, разрешено включить CLR ,нативный код VC ++ может вызывать сборку .NET напрямую (пример кода: использование библиотеки C # в нативном C или C ++ с использованием C ++ / CLI )

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

Вот решение.Решение позволяет вызывать функцию C # из C, декорируя вашу функцию атрибутом [DllExport] (в противоположность P / Invoke DllImport).

https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

Код C #

class Test
{
     [DllExport("add", CallingConvention = CallingConvention.StdCall)]
     public static int Add(int left, int right)
     {
         return left + right;
     } 
}

C code

 int main()
 {
      int z = add(5,10);
      printf("The solution is found!!! Z is %i",z);
      return 0;
 }

Как @ iceflow19 прокомментировал ниже:

Автор ссылки предоставляет препроцессор CLR IL в качестве дополнительного шага во время компиляции.Поскольку сборки используют одинаковый двоичный формат контейнеров (DLL) в Windows, если вы вручную добавляете смещения функций .Net в IL в vtable (список экспорта dll), Windows достаточно умен, чтобы вызывать CLR для запуска этого кода при вызовеот C. Однако есть накладные расходы.Это необъявленная особенность.Вот как работают смешанные управляемые библиотеки в C ++ / CLI.Чтобы использовать его, просто добавьте его через Nuget.Дополнительная цель, добавленная в ваш файл проекта MSBuild, обеспечит шаг предварительной обработки IL

8 голосов
/ 13 декабря 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...