2012-03-19 26 views
6

Tengo un puñado de archivos .dll con clases diseñadas para controlar un dispositivo externo conectado a mi escritorio a través de ethernet. Me gustaría importar estas clases a python y usar sus funciones miembro/variables, etc. para controlar el dispositivo.cómo acceder a una clase desde un dll en python?

He mirado en un número de opciones que incluyen:

-ctypes (que parecían funcionar bien para funciones pero no clases). Aquí "DotNet \ Aerotech.Ensemble.dll" es mi biblioteca dll, y "Network" es una clase en esa biblioteca con una función de miembro "Connect". Las cargas de la biblioteca, pero no pueden acceder a la clase ...

>>> 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 para .Net pero éstas parecen ser las lenguas separadas por completo y quiero ser capaz de hacer de todo, desde un solo lugar (pitón).

-SWIG. La documentación de SWIG parece indicar que puede manejar clases de importación, pero también parece requerir código C++ y/o archivos de encabezado (que no tengo) para envolver para usar como un módulo de Python.

Soy un principiante y bastante perdido aquí, así que se agradece cualquier ayuda!

EDIT:

@SvenMarnach: Yo tenía un aspecto en IronPython y fue capaz de conseguir que funcione con mis archivos dll, pero quiero hacer esto en Python ya que ya estoy haciendo un montón de cosas en ese idioma Quiero integrar estas funciones o clases dll o lo que sea en programas Python existentes.

Al hacer funcionar IronPython, sin embargo, tropecé al Python for .NET que afirma poder instalar .Net awareness en las instalaciones de python existentes ... Esto funciona (es decir, puedo acceder a los archivos dll y controlar mi dispositivo) si Úselo en el directorio en el que descargué el pitón para archivos .NET, pero si lo intento en algún otro directorio (recordando agregar el directorio python.net al sys.path), aparece un error ImportError: dynamic module does not define init function (initclr)

+2

Por lo que yo sé, las DLL no pueden "contener clases". Pueden contener funciones, y los compiladores manipularán nombres de métodos a nombres de funciones antes de ponerlos en una DLL. Así que esto depende enteramente de la lengua de los archivos DLL se implementan en (Negación: No estoy familiarizado con .NET y la plataforma de Windows.). –

+1

Esto puede no ser relevante, pero "DLL" con bastante frecuencia dotnet no son en realidad archivos DLL compilados binarios , son C# bytecode con una extensión dll. – aquavitae

+0

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

Respuesta

1

Como entiendo, quieres usar clases .NET en tu código python. Tampoco estoy muy familiarizado con C# y la forma en que funciona, pero si lo entiendo bien, se puede compilar en una DLL en el Common Intermediate Language. Este CIL es un lenguaje de programación definido por Common Language Infrastructure, inventado por Microsoft y la base del framework .NET. Para leer CIL, debe usar Common Language Runtime, que es básicamente un compilador Just-In-Time para mecanizar código de bytes legible. Aquí creo que yace la solución a su problema. Para usar las clases definidas en el DLL que con suerte contiene clases en el CIL, necesitarás un CLR que mapee el código de bytes de CIL a Python. IronPython tiene un mapeador de CLR. Sin embargo, es posible utilizar un CLR que funcione con Python puro, a menudo estos mapper pueden ser de una sola vía (con el que trabajé). Si necesita usar funciones que esperan objetos CIL/.NET, necesitará un CLR que pueda convertir objetos CIL y Python en ambos sentidos.

espero que este iwas útil. Si necesita más información, le sugiero que consulte el documentation on the .NET integration for IronPython como ya se indicó anteriormente.

Cuestiones relacionadas