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)
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.) –
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
http: // stackoverflow.it/questions/2082159/how-to-export-c-sharp-methods – cons0ul