2010-01-17 7 views
15

Come possiamo esportare i metodi C#?Come esportare i metodi C#?

Ho una DLL e voglio usare i suoi metodi nel linguaggio Python con il modulo ctypes. Perché ho bisogno di usare il modulo ctypes, ho bisogno di esportare i metodi C# per essere visibili in Python.

Quindi, come posso esportare i metodi C# (come fanno in C++)?

+1

Perché non utilizzare IronPython? –

+0

"order" del Professor –

+0

python.net consente l'interpolazione bidirezionale tra Python e .NET utilizzando Python C-API e .NET Pinvoke e Unmanaged Exports, menzionati di seguito. Quindi tutti i pezzi duri sono scritti per te! http://pythonnet.github.io/ – denfromufa

risposta

22

Contrariamente a quanto si crede, questo è possibile.
Vedere here.

+1

Ho usato il dllexp.exe per vedere i metodi esportati dalla dll di C# che il modello crea e non ha avuto successo con il metodo .. C'è un modo per i metodi di dll di C# essere visibili esternamente in un programma come dllexp.exe ? –

+0

tks per la risposta;) –

1

Con la normale implementazione di Python ("CPython"), non è possibile, almeno non direttamente.

È possibile scrivere wrapper C nativi attorno ai nostri metodi C# utilizzando C++/CLI e chiamare questi wrapper da Python.

Oppure, si potrebbe provare IronPython. Ciò ti consente di eseguire codice Python e codice di chiamata in qualsiasi linguaggio .Net, incluso C#.

+1

Voglio usare Python stesso e non un'implementazione extra come IronPython. –

1

(Questo potrebbe non essere più pertinente, in quanto SLaks ha trovato che puntano ingegnoso, ma lascio una versione modificata per riferimento ...)

Il modo "normale" di esporre .NET/C# oggetti il codice non gestito (come Python) consiste nel creare un wrapper COM-callable per la DLL C# (assembly .NET) e chiamarlo usando il supporto COM/OLE di Python. Per creare il wrapper COM-callable, utilizzare le utilità della riga di comando tlbexp e/o regasm.

Ovviamente, tuttavia, questo non fornisce l'API in stile C/DLL del collegamento di SLaks.

+1

In realtà, è possibile. Vedi la mia risposta. – SLaks

1

Questo non è possibile. Se hai bisogno di esportazioni di DLL dovrai usare il linguaggio C++/CLI. Ad esempio:

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

La classe può essere scritta anche in C#. Il compilatore C++/CLI emette un thunk speciale per l'esportazione che garantisce il caricamento del CLR e l'esecuzione passa alla modalità gestita. Questo non è esattamente veloce.

Scrivere un codice [ComVisible (true)] in C# è un'altra possibilità.

+1

In realtà, è possibile. Vedi la mia risposta. – SLaks

+1

Meh, né l'articolo né il codice sorgente scaricabile spiegano come funziona. Aspetterò la conferma dall'OP. –

+0

Ho dovuto creare un wrapper C++ dll (del C# dll) per usare correttamente il modulo ctypes! –