Чтобы вызвать C API из С#, я бы использовал P/Invoke. Но если я должен сделать обратное, вызовите .NET API от C, как бы я это сделал?
Если вы действительно хотите сделать все это через API-интерфейсы C и выполните окончание работы с COM и С++, вы можете сделать следующее. Но сначала выясните, действительно ли это необходимо! Я подозреваю, что в большинстве случаев этого не будет.
Шаг 1. Создайте сборку С#.Net, которую вы хотите вызвать.
Шаг 2. Создайте сборку CLI/С++ смешанного режима с экспортированными функциями extern "C". Попросите эту сборку вызвать сборку C $.
Шаг 3. Создайте приложение C, которое вызывает экспортированные функции стиля C из библиотеки DLL, сделанные на шаге 2.
Что нужно учитывать.
A. Есть ли реальная потребность в том, чтобы приложение C (против С++/COM) напрямую вызывало сборку .Net?
Другими словами, почему бы не использовать С++ и COM для COM экспортированных методов .Net, если у вас действительно должно быть смешанное (.Net и не .Net) приложение/система?
В. Будут ли написанные API быть обертки на классах? Если да, то как вы будете управлять своим временем жизни? (например, будете ли вы создавать/использовать дескрипторы? Как вы будете управлять своими отношениями с фактическими объектами gc... и т.д.)
С. Строки. Они очень различаются между C и .Net. Убедитесь, что вы знакомы с их различиями и как правильно отправлять строки через эти границы... Подсказка: CString - ваш друг.
Существует решение, которое может избежать использования COM или С++\CLI. См. Здесь: Вызов управляемого .NET-метода из собственного кода
Вот решение. Он реализует атрибут [DllExport] 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;
}
вы можете превратить код С# в COM или использовать С++\CLI.