如何从python中的DLL访问类?

时间:2012-03-19 13:53:34

标签: .net python class dll python.net

我有一些.dll文件,其中的类用于控制通过以太网连接到桌面的外部设备。我想将这些类导入python并使用它们的成员函数/变量等来控制设备。

我看了很多选项,包括:

-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 for .Net但这些似乎完全是单独的语言,我希望能够从一个地方(python)做所有事情。

-SWIG。 SWIG文档似乎表明它可以处理导入类,但似乎也需要包装C ++代码和/或头文件(我没有)作为python模块使用。

我是初学者并且在这里相当失落,所以感谢任何帮助!

编辑:

@SvenMarnach:我看过IronPython并且能够使用我的dll文件,但我想在 Python 中这样做,因为我已经做了很多事情语言。我想将这些dll函数或类或任何东西集成到现有的python程序中。

然而,在让IronPython正常工作的过程中,我偶然发现Python for .NET声称可以将.Net感知安装到现有的python安装...这样可行(即我可以访问dll文件并控制我的设备)如果我在我下载python for .NET文件的目录中使用它,但是如果我在其他目录中尝试它(记得将​​python.net目录附加到sys.path),则会出现错误{{ 1}}

1 个答案:

答案 0 :(得分:1)

据我所知,你想在你的python代码中使用.NET类。我对C#及其工作方式也不是很熟悉,但如果我理解正确,它可以编译成通用中间语言的DLL。此CIL是由Microsoft发明的公共语言基础结构定义的编程语言,也是.NET框架的基础。要读取CIL,您必须使用公共语言运行时,它基本上是一个即时编译器,用于加工可读的字节代码。 在这里,我认为解决您的问题。要使用DLL中定义的类,希望在CIL中包含类,您需要一个将CIL映射到Python字节代码的CLR! IronPython有这样一个CLR映射器。然而,有可能使用一个与纯Python一起工作的CLR,这些映射器通常只有一种方式(我使用过的那个)。如果您需要使用期望CIL / .NET对象的函数,您将需要一个可以在两种方式之间在CIL和Python对象之间进行转换的CLR。

我希望这对我很有帮助。如果您需要更多信息,我建议您查看上面已经说明的documentation on the .NET integration for IronPython