2010-01-16 19 views
15

come posso caricare un C# dll in python?Come caricare una DLL in C# in python?

Devo inserire del codice aggiuntivo nei file C#? (come l'esportazione in file C++)

Non voglio usare IronPython. Voglio importare un modulo in Python!

+0

Si potrebbe voler aggiungere un po 'di chiarimenti. Stiamo parlando di * CPython * o * IronPython *? –

+0

Voglio importare un modulo in Python (non IronPython quindi ..) –

+0

Hai intenzione di lottare. Una DLL C# è scritta in CIL e non è python, né è leggibile da python. Stai andando a finire fuori. NET e utilizzare IronPython o soffrire il dolore dell'uso di COM. Non c'è un modo per usare un modulo Python nativo? –

risposta

4

Questo è per rispondere alla seconda parte della domanda Provare a rendere visibile la DLL COM.

utilizzando il

[ComVisible(true)] 

Ok IronPython è un implemenatation .net del linguaggio Python La tecnologia sta per utilizzare il DLR di .NET 4.0 quando arriva così IronPython avrà più Dinamismo (è quella parola). (In inglese se sei un guru Python, ti sentirai più a tuo agio quando usi IronPython)

Quindi potresti scegliere IronPython, se lo fai puoi saltare la parte visibile di COM. Dal momento che sia (C#, Python ferro) sono sotto .Net

http://ironpython.net/

Visit here for a sample C# DLL which is visible to COM

+0

Ora che ho visto Ironpython ho capito di cosa si trattava. Non lo voglio Voglio importare un modulo in python: P –

+0

Significa importare (porta) il codice C# in Python o importare una dll C# in Python –

+0

Importare e utilizzare le funzioni da una D # C in Python –

16

Il pacchetto Python for.NET e l'implementazione Python IronPython ora funzionano allo stesso modo.

Esempio per un C# DLL MyDll.dll:

import clr 
clr.AddReference('MyDll') 
from MyNamespace import MyClass 
my_instance = MyClass() 

Vedere this post per maggiori dettagli.

+1

intall prima con 'pip3 install pythonnet' – Felix

1

Se non si desidera utilizzare soluzioni come Python .NET o IronPython, è possibile implementare un wrapper C++/CLI e utilizzare Pythons ctypes per caricarlo. Per esempio:

La libreria CallCSharp C++/CLI:

extern "C" { 
    __declspec(dllexport) void foo() 
    { 
     // here you could use managed and unmanaged code 
     Console.WriteLine("Hello, C# world..."); 
    } 

Il Python script:

from ctypes import cdll 
lib = cdll.LoadLibrary("./CallCSharp.dll") 
lib.foo() 

sono fermamente recomment leggere questo blog: http://pragmateek.com/if-your-plumbing-doesnt-work-youre-just-not-using-enough-pipes/#more-1745

Gestisce anche la problema che si presenta quando il wrapper C++/CLI chiama il codice che si trova in un altro assembly (si otterrebbe qualcosa come un Wind owsError: [Errore -532462766] Errore di Windows 0xE0434352 dal tuo script Python quindi).

+0

Funziona su Mono e .NET Core? – denfromufa

+0

Non so. E ho già abbandonato questo approccio, non ho avuto il caricamento degli assembly referenziati in esecuzione. Proverò a capire Python .NET. – anhoppe