Ответ 1
Вопреки распространенному мнению, это возможно.
См. здесь.
Как мы можем экспортировать методы С#?
У меня есть dll, и я хочу использовать его методы на языке Python с модулем ctypes. Поскольку мне нужно использовать модуль ctypes, мне нужно экспортировать методы С#, чтобы они были видимыми в Python.
Итак, как я могу экспортировать методы С# (например, они есть на С++)?
Вопреки распространенному мнению, это возможно.
См. здесь.
С обычной реализацией Python ( "CPython" ) вы не можете, по крайней мере, не напрямую.
Вы можете написать собственные оболочки C вокруг наших методов С#, используя С++/CLI и вызывать эти обертки из Python.
Или вы можете попробовать IronPython. Это позволяет запускать код Python и код вызова на любом языке .Net, включая С#.
(Это может быть уже не актуально, поскольку SLaks нашел эту гениальную ссылку, но я останусь отредактированной версией для справки...)
"Обычный" способ подвергать объекты .NET/С# неуправляемому коду (например, Python) - создавать COM-вызываемую оболочку для С# DLL (сборка .NET) и вызывать ее с помощью поддержки Python COM/OLE. Чтобы создать COM-вызываемую оболочку, используйте утилиты командной строки tlbexp
и/или regasm
.
Очевидно, однако, это не обеспечивает API-интерфейс типа C/DLL, который имеет ссылка SLaks.
Это невозможно. Если вам нужен экспорт DLL, вам нужно будет использовать язык С++/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);
}
Класс также может быть записан на С#. Компилятор С++/CLI выделяет специальный поток для экспорта, который обеспечивает загрузку CLR и выполнение переключается в управляемый режим. Это не так быстро.
Ввод кода [ComVisible (true)] в С# - это еще одна возможность.