2015-10-22 102 views
3

我有一個第三方的c#dll,它已經在dot net 4.5中創建並具有x86的平臺目標。我想將它導入python腳本中,並且我已經開始使用Rob Deary的回答here。但是我不能讓他的例子工作。我正在使用python 2.7.6版本,我得到了一個AttributeError,如下所示。如何將C#dll導入python

File "C:\Python27\Lib\ctypes\__init__.py", line 378, in __getattr__ 
    func = self.__getitem__(name) 
File "C:\Python27\Lib\ctypes\__init__.py", line 383, in __getitem__ 
    func = self._FuncPtr((name_or_ordinal, self)) 
AttributeError: function 'add' not found 

請注意,我知道的網點Ironpython和Python,但我需要得到這個特別與C python工作。這裏是生成自定義的C#庫我的示例代碼:ClassLibrary1.dll

using System; 
using System.Runtime.InteropServices; 
using RGiesecke.DllExport; 

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.Cdecl)] 
    public static int TestExport(int a, int b) 
    { 
     return a + b; 
    } 
} 

而這裏的python腳本生成錯誤

import ctypes 
lib = ctypes.cdll.LoadLibrary('ClassLibrary1.dll') 
lib.add(3,5) 

當我使用下面的線,這是輸出我得到。所以至少我知道它正在加載DLL,但我不知道爲什麼無法找到函數。

>>> lib.__dict__ 
{'_FuncPtr': <class 'ctypes._FuncPtr'>, '_handle': 254476288, '_name': 'ClassLibrary1.dll'} 
>>> 

任何幫助將不勝感激。謝謝

+0

您正在傳遞python類型而不是c_types到您使用ctypes在python中加載的lib函數。嘗試'lib.add(c_int(3),c_int(5))' – denfromufa

回答

0

正如RGiesecke.DllExport文檔所述,您需要在構建代碼時針對特定體系結構(x86或x64)。將其設置爲任何CPU(默認)都不起作用。

+0

如果您重新閱讀我的問題,您將看到平臺目標已指定爲x86 – BeeLabeille

+0

您提到第三方DLL已編譯爲x86 ,但如果你自己的代碼不是的話。第三方DLL是否也使用DllExport屬性?我想我只是困惑你爲什麼開始談論第三方DLL,但隨後顯示你自己的代碼根本不使用該DLL。你的代碼是正確的,應該工作,所以它一定是你沒有顯示的東西。 – Sparafusile