2012-03-19 24 views
6

Mam kilka plików .dll z klasami zaprojektowanymi do kontrolowania urządzenia zewnętrznego podłączonego do mojego pulpitu za pośrednictwem sieci Ethernet. Chciałbym zaimportować te klasy do Pythona i użyć ich funkcji/zmiennych członkowskich, aby sterować urządzeniem.jak uzyskać dostęp do klasy z biblioteki DLL w python?

Mam spojrzał na szereg opcji, w tym:

-ctypes (wydawały się działać dobrze dla funkcji, ale nie klasy). Tutaj "DotNet \ Aerotech.Ensemble.dll" jest moją biblioteką dll, a "Sieć" jest klasą w tej bibliotece z funkcją członka "Połącz". Obciążenia biblioteki, ale nie może uzyskać dostępu do klasy ...

>>> 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 dla .NET, ale te wydają się być całkowicie oddzielne języków i chcę, aby być w stanie zrobić wszystko z jednego miejsca (pyton).

-SWIG. Dokumentacja SWIG wydaje się wskazywać, że może obsługiwać importowanie klas, ale wydaje się również wymagać, aby kod C++ i pliki nagłówkowe (które nie są) były pakowane do użycia jako moduł python.

Jestem początkujący i dość zagubiony, więc każda pomoc jest doceniana!

EDIT:

@SvenMarnach: Musiałem spojrzeć na IronPython i był w stanie dostać pracy z moich dll, ale chcę to zrobić w Python ponieważ jestem już robi wiele rzeczy w tym języku. Chcę zintegrować te funkcje dll lub klas lub cokolwiek z istniejącymi programami python.

Podczas pracy z IronPythonem natknąłem się na Python for .NET, który twierdzi, że jest w stanie zainstalować .Net do istniejących instalacji Pythona ... To działa (tzn. Mogę uzyskać dostęp do plików dll i kontrolować moje urządzenie), jeśli użyj go w katalogu, do którego pobrałem python dla plików .NET, ale jeśli spróbuję go w jakimś innym katalogu (pamiętając o dołączeniu katalogu python.net do sys.path), pojawi się błąd

+2

O ile mi wiadomo, biblioteki DLL nie mogą "zawierać klas". Mogą zawierać funkcje, a kompilatory będą zestawiać nazwy metod z nazwami funkcji przed umieszczeniem ich w bibliotece DLL. To zależy całkowicie od języka, w którym są zaimplementowane biblioteki DLL. (Uwaga: nie znam platformy .NET i Windows). –

+1

Może to nie być istotne, ale często "biblioteki dll" nie są binarnie skompilowanymi bibliotekami dll , są to C# kod bajtowy z rozszerzeniem dll. – aquavitae

+0

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

Odpowiedz

1

Jak rozumiem, chcesz używać klas .NET w swoim kodzie Pythona. Nie jestem również bardzo zaznajomiony z C# i sposobem, w jaki działa, ale jeśli dobrze to rozumiem, może zostać skompilowany do biblioteki DLL w Common Intermediate Language. To CIL jest językiem programowania zdefiniowanym przez Common Language Infrastructure, który został wymyślony przez Microsoft i podstawą platformy .NET. Aby przeczytać CIL, musisz użyć Common Runtime, który jest w zasadzie kompilatorem Just-in-Time do odczytu kodu bajtowego maszyny. Tutaj myślę, że leży rozwiązanie twojego problemu. Aby użyć klas zdefiniowanych w bibliotece DLL, która, mam nadzieję, zawiera klasy w CIL, będziesz potrzebował CLR, który mapuje CIL na kod bajtowy Pythona! IronPython ma takiego programu odwzorowującego CLR. Jednak możliwe jest użycie CLR, który działa z czystym Pythonem, często te programy odwzorowujące mogą być tylko w jeden sposób (ten, z którym pracowałem). Jeśli potrzebujesz użyć funkcji, które oczekują obiektów CIL/.NET, potrzebujesz CLR, który może konwertować obiekty CIL i Python w obie strony.

Mam nadzieję, że to będzie pomocne. Jeśli potrzebujesz więcej informacji, proponuję spojrzeć na documentation on the .NET integration for IronPython, jak już wspomniano powyżej.

Powiązane problemy