2012-03-19 164 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