Подтвердить что ты не робот

Вызов С# из C

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

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

Спасибо, Sveerap

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

Код С#

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

C-код

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

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

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