2012-03-19 15 views
6

Ho una manciata di file .dll con classi progettate per controllare un dispositivo esterno collegato al mio desktop via ethernet. Mi piacerebbe importare queste classi in Python e usare le loro funzioni/variabili membro ecc per controllare il dispositivo.come accedere a una classe da una DLL in python?

Ho guardato una serie di opzioni tra cui:

-ctypes (che sembrava funzionare bene per le funzioni, ma non classi). Qui "DotNet \ Aerotech.Ensemble.dll" è la mia libreria DLL e "Network" è una classe in quella libreria con una funzione membro "Connetti". I carichi di libreria, ma non posso accedere alla classe ...

>>> from ctypes import * 
>>> lib = cdll.LoadLibrary('DotNet\Aerotech.Ensemble.dll') 
>>> lib.Network.Connect() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python26\lib\ctypes\__init__.py", line 366, in __getattr__ 
    func = self.__getitem__(name) 
    File "C:\Python26\lib\ctypes\__init__.py", line 371, in __getitem__ 
    func = self._FuncPtr((name_or_ordinal, self)) 
AttributeError: function 'Network' not found 

-IronPython/Python for .Net, ma questi sembrano essere separati lingue del tutto e voglio essere in grado di fare tutto da un luogo (pitone).

-SWIG. La documentazione SWIG sembra indicare che è in grado di gestire le classi di importazione, ma sembra anche richiedere il codice C++ e i file di intestazione (che non ho) da incapsulare per l'uso come modulo python.

Sono un principiante e abbastanza perso qui, quindi qualsiasi aiuto è apprezzato!

EDIT:

@SvenMarnach: Ho avuto uno sguardo al IronPython ed è stato in grado di farlo funzionare con i miei file dll, ma voglio fare questo in Python dal momento che sto già facendo un sacco di cose in quella lingua Voglio integrare queste funzioni o classi di DLL o qualsiasi cosa nei programmi Python esistenti.

Nel far funzionare IronPython, tuttavia, sono inciampato su Python for .NET che dichiara di essere in grado di installare la conoscenza di .Net alle installazioni Python esistenti ... Funziona (cioè posso accedere ai file dll e controllare il mio dispositivo) se usarlo nella directory in cui ho scaricato python per i file .NET, ma se provo in qualche altra directory (ricordando di aggiungere la directory python.net al sys.path), si ottiene un errore ImportError: dynamic module does not define init function (initclr)

+2

Per quanto ne so, le DLL non possono "contenere classi". Possono contenere funzioni e i compilatori modificheranno i nomi dei metodi in nomi di funzioni prima di inserirli in una DLL. Quindi questo dipende interamente dal linguaggio in cui vengono implementate le DLL. (Disclaimer: Non ho familiarità con .NET e la piattaforma Windows.) –

+1

Questo potrebbe non essere rilevante, ma abbastanza spesso le "dll" dotnet non sono in realtà dll compilate in formato binario , sono C# bytecode con un'estensione dll. – aquavitae

+0

http: // stackoverflow.it/questions/2082159/how-to-export-c-sharp-methods – cons0ul

risposta

1

Come ho capito, vuoi usare le classi .NET nel tuo codice Python. Inoltre, non ho molta familiarità con C# e il modo in cui funziona, ma se ho capito bene, può essere compilato in una DLL in Common Intermediate Language. Questo CIL è un linguaggio di programmazione definito dalla Common Language Infrastructure inventato da Microsoft e la base per il framework .NET. Per leggere CIL devi usare un Common Language Runtime che è fondamentalmente un compilatore Just-In-Time per leggere codice byte leggibile. Qui penso che sia la soluzione al tuo problema. Per usare le classi definite nella DLL che con speranza contiene classi nel CIL avrai bisogno di un CLR che mappa il codice byte CIL in Python! IronPython ha un tale mappatore CLR. Tuttavia è possibile usare un CLR che funziona con Python puro, spesso questi mapper possono essere unidirezionali (quello con cui ho lavorato). Se hai bisogno di usare funzioni che si aspettano oggetti CIL/.NET avrai bisogno di un CLR che possa convertire tra oggetti CIL e Python in entrambi i modi.

Spero che questo sia stato utile. Se hai bisogno di ulteriori informazioni ti suggerisco di guardare allo documentation on the .NET integration for IronPython come già detto sopra.