Как экспортировать методы C #? - PullRequest
15 голосов
/ 17 января 2010

Как мы можем экспортировать методы C #?

У меня есть dll, и я хочу использовать ее методы на языке Python с модулем ctypes.Поскольку мне нужно использовать модуль ctypes, мне нужно экспортировать методы C #, чтобы они были видны в Python.

Итак, как я могу экспортировать методы C # (как они это делают в C ++)?

Ответы [ 4 ]

23 голосов
/ 17 января 2010

Вопреки распространенному мнению, возможно .
Смотри здесь .

1 голос
/ 17 января 2010

Это невозможно. Если вам нужен экспорт DLL, вам нужно использовать язык C ++ / CLI. Например:

public ref class Class1 {
public:
  static int add(int a, int b) {
      return a + b;
  }
};

extern "C" __declspec(dllexport) 
int add(int a, int b) {
  return Class1::add(a, b);
}

Класс может быть написан также на C #. Компилятор C ++ / CLI генерирует специальный поток для экспорта, который обеспечивает загрузку CLR и переключение выполнения в управляемый режим. Это не совсем быстро.

Написание кода [ComVisible (true)] на C # - еще одна возможность.

1 голос
/ 17 января 2010

(Это может быть уже неактуально, так как SLaks нашел эту оригинальную ссылку, но я оставлю отредактированную версию для справки ...)

"Нормальный" способ предоставления объектам .NET / C # неуправляемого кода (например, Python) - создать оболочку, вызываемую COM, для C # DLL (сборка .NET) и вызывать ее, используя поддержку Python COM / OLE. Чтобы создать COM-вызываемую оболочку, используйте утилиты командной строки tlbexp и / или regasm.

Очевидно, однако, что это не предоставляет API в стиле C / DLL, который делает ссылка SLaks.

1 голос
/ 17 января 2010

С обычной реализацией Python ("CPython") вы не можете, по крайней мере, напрямую.

Вы можете написать собственные оболочки C для наших методов C #, используя C ++ / CLI , и вызывать эти оболочки из Python.

Или вы можете попробовать IronPython . Это позволяет запускать код Python и код вызова на любом языке .Net, включая C #.

...