2010-01-17 14 views
15

Jak możemy eksportować metody C#?Jak wyeksportować metody C#?

Mam dll i chcę użyć jego metod w języku Python z modułem ctypes. Ponieważ muszę użyć modułu ctypes, muszę wyeksportować metody C#, aby były widoczne w Pythonie.

Jak więc wyeksportować metody C# (tak jak w C++)?

+1

Dlaczego nie używać IronPython? –

+0

"Zamówienie" Profesora –

+0

python.net umożliwia dwukierunkowe współdziałanie między Python i .NET przy użyciu C-API Pythona i .NET Pinvoke i Unmanaged Exports, wymienionych poniżej. Więc wszystkie trudne utwory są napisane dla ciebie! http://pythonnet.github.io/ – denfromufa

Odpowiedz

22

Wbrew powszechnemu przekonaniu, ten jest możliwy pod warunkiem.
Zobacz here.

+1

Użyłem programu dllexp.exe, aby zobaczyć wyeksportowane metody z biblioteki C#, które tworzy szablon, i nie doszło do tej metody. Czy istnieje sposób, aby metody C# dll były widoczne zewnętrznie w programie takim jak dllexp.exe ? –

+0

tks za odpowiedź;) –

1

Przy normalnej implementacji Pythona ("CPython"), nie możesz, a przynajmniej nie bezpośrednio.

Możesz pisać natywne opakowania C wokół naszych metod C#, używając C++/CLI i wywoływać te opakowania z Pythona.

Lub możesz spróbować IronPython. Pozwala to na uruchamianie kodu Pythona i kodu wywołania w dowolnym języku .Net, w tym w języku C#.

+1

Chcę używać samego Pythona, a nie jego dodatkowej implementacji, jak IronPython. –

1

(To może nie być już istotne, ponieważ SLaks stwierdził, że pomysłowy linku, ale zostawię edytowanej wersji dla odniesienia ...)

„normalna” sposób odsłaniając .NET/C# obiekty niezarządzanego kodu (takiego jak Python) jest utworzenie wrappera COM dla biblioteki DLL C# (zestawu .NET) i wywołanie tego przy użyciu obsługi Pythona COM/OLE. Aby utworzyć opakowanie COM-Callable, należy użyć narzędzi wiersza polecenia z wiersza polecenia tlbexp i/lub regasm.

Oczywiście nie zapewnia to interfejsu API w stylu C/DLL, który ma łącze SLaks.

+1

W rzeczywistości jest to możliwe. Zobacz moją odpowiedź. – SLaks

1

To niemożliwe. Jeśli potrzebujesz eksportu do biblioteki DLL, musisz użyć języka C++/CLI. Na przykład:

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); 
} 

Klasa może być również napisana w języku C#. Kompilator C++/CLI emituje specjalne polecenie eksportu, które zapewnia załadowanie CLR, a wykonanie przechodzi w tryb zarządzany. To nie jest dokładnie szybkie.

Pisanie kodu [ComVisible (true)] w języku C# to kolejna możliwość.

+1

W rzeczywistości jest to możliwe. Zobacz moją odpowiedź. – SLaks

+1

Meh, ani artykuł, ani kod źródłowy do pobrania nie wyjaśniają, jak to działa. Będę czekać na potwierdzenie z PO. –

+0

Musiałem zbudować wrappera C++ dll (z C# dll), aby poprawnie użyć modułu ctypes! –

Powiązane problemy