2010-01-17 4 views
15

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

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

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

+1

Почему бы не использовать IronPython? –

+0

Профессорский «заказ» –

+0

python.net позволяет двунаправленный переход между Python и .NET с использованием Python C-API и .NET Pinvoke и Unmanaged Exports, упомянутых ниже. Итак, все тяжелые пьесы написаны для вас! http://pythonnet.github.io/ – denfromufa

ответ

22

Вопреки распространенному мнению, этот является возможно.
См. here.

+1

Я использовал dllexp.exe, чтобы просмотреть экспортированные методы из DLL C#, которые создает шаблон, и это не дополнило метод. Есть ли способ, чтобы методы dll C# были видимы извне в такой программе, как dllexp.exe ? –

+0

tks для ответа;) –

1

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

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

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

+1

Я хочу использовать сам Python, а не дополнительную реализацию, например IronPython. –

1

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

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

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

+1

Собственно, это возможно. См. Мой ответ. – SLaks

1

Это невозможно. Если вам нужен экспорт 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

Собственно, это возможно. См. Мой ответ. – SLaks

+1

Мех, ни статья, ни загружаемый исходный код не объясняют, как это работает. Я буду ждать подтверждения от OP. –

+0

Мне пришлось создать обертку C++ dll (из C# dll), чтобы правильно использовать модуль ctypes! –

Смежные вопросы