Вызов C # (.NET) API из C - PullRequest
       11

Вызов C # (.NET) API из C

2 голосов
/ 08 февраля 2010

Для вызова C API из C # я бы использовал P / Invoke. Но если бы я сделал обратное, позвонил бы .NET APIs из C, как бы я поступил?

Ответы [ 4 ]

2 голосов
/ 08 февраля 2010

Если вы действительно хотите сделать все это через C API и выполнить конечный прогон вокруг COM и C ++, вы можете сделать следующее. Но сначала выясните, действительно ли это необходимо! Я подозреваю, что в большинстве случаев это не будет.

Шаг 1. Создайте сборку C # .Net, которую вы хотите вызвать.

Шаг 2. Создайте сборку CLI / C ++ в смешанном режиме с экспортированными внешними функциями «C». Пусть эта сборка вызывает сборку C $.

Шаг 3. Создайте приложение C, которое вызывает экспортированные функции стиля C из библиотеки DLL, созданной на шаге 2.

Что нужно учитывать. A. Есть ли необходимость в том, чтобы приложение C (по сравнению с C ++ / COM) напрямую вызывало сборку .Net?
Другими словами, почему бы не использовать экспортированные из C ++ и COM в COM методы .Net, если вы действительно должны иметь смешанную (.Net и не .Net) систему / приложение?

B. Будут ли написанные вами API обертками для классов? Если так, как вы будете управлять их временем жизни? (например, будете ли вы создавать / использовать дескрипторы? Как вы будете управлять их отношениями с реальными объектами gc ... и т. д.)

C. Строки. Они обрабатываются очень по-разному между C и .Net. Убедитесь, что вы знакомы с их различиями и как правильно отправлять строки через эти границы ... Подсказка: CString - ваш друг.

1 голос
/ 08 февраля 2010

Существует решение, позволяющее избежать использования COM или C ++ \ CLI. См. Здесь: Вызов управляемого метода .NET из собственного кода

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

Вот решение. Он реализует атрибут [DllExport] 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

 int main()
 {
      int z = add(5,10);
      printf("The solution is found!!! Z is %i",z);
      return 0;
 }
0 голосов
/ 08 февраля 2010

Вы можете превратить код C # в COM или использовать C ++ \ CLI.

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