2012-03-19 149 views
6

我有一個.dll文件與設計類的控制通過以太網連接到我的桌面的外部設備。我想導入這些類到python並使用它們的成員函數/變量等來控制設備。如何在python中從dll訪問類?

我已經看過了許多選項,包括:

-ctypes(這似乎很好的功能,但不是類工作​​)。在這裏,「DotNet \ Aerotech.Ensemble.dll」是我的dll庫,「Network」是該庫中的一個類,具有成員函數「Connect」。該庫加載,但我不能訪問類的...

>>> 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的對於.NET,但這些似乎完全是獨立的語言,我希望能夠從一個地方做的一切(蟒蛇)。

-SWIG。 SWIG文檔似乎表明它可以處理導入類,但似乎還需要將C++代碼和/或頭文件(我沒有)用作python模塊進行打包。

我是一個初學者,在這裏相當丟失,所以任何幫助表示讚賞!

編輯:

@SvenMarnach:我看了一下IronPython和能得到它與我的dll文件的工作,但我想這樣做在的Python,因爲我已經做了很多事情用那種語言。我想將這些dll函數或類或其他任何東西集成到現有的python程序中。但是,我偶然發現Python for .NET聲稱能夠將.Net感知安裝到現有的python安裝中......如果我能夠訪問dll文件並控制我的設備,這種方法可行(即我可以訪問dll文件並控制我的設備)在我下載python for .NET文件的目錄中使用它,但是如果我在其他目錄中嘗試它(記住要將python.net目錄添加到sys.path),則會出現錯誤ImportError: dynamic module does not define init function (initclr)

+2

據我所知,DLLs不能「包含類」。它們可以包含函數,並且編譯器在將函數名放入DLL之前會將方法名稱轉換爲函數名。所以這完全取決於實現DLL的語言。(免責聲明:我不熟悉.NET和Windows平臺。) – 2012-03-19 13:58:01

+1

這可能不相關,但很多時候dotnet「dll」實際上並不是二進制編譯的dll ,它們是帶有dll擴展名的c#字節碼。 – aquavitae 2012-03-19 13:58:54

+0

http:// stackoverflow。com/questions/2082159/how-to-export-c-sharp-methods – cons0ul 2012-03-19 14:59:50

回答

1

據我瞭解,你想在你的python代碼中使用.NET類。我對C#和它的工作方式也不是很熟悉,但是如果我理解它,它可以編譯成通用中間語言的DLL。這個CIL是由微軟發明的通用語言基礎結構定義的編程語言,也是.NET框架的基礎。要閱讀CIL,你必須使用一個基本上是即時編譯器的公共語言運行時來加工可讀的字節碼。 在這裏,我認爲解決您的問題。要使用DLL中定義的類,該類中希望包含CIL中的類,您需要一個將CIL映射到Python字節碼的CLR! IronPython有這樣一個CLR映射器。然而,可以使用一個可以與純Python協同工作的CLR,但這些映射器可能只是一種方法(與我一起工作的那種方法)。如果您需要使用期望CIL/.NET對象的函數,那麼您將需要一個可以在兩種方式之間轉換CIL和Python對象的CLR。

我希望這是我的幫助。如果您需要更多信息,我建議如上所述查看documentation on the .NET integration for IronPython