2012-03-19 3 views
6

У меня есть несколько файлов .dll с классами, предназначенными для управления внешним устройством, подключенным к моему рабочему столу через ethernet. Я хотел бы импортировать эти классы в python и использовать их функции-члены/переменные и т. Д. Для управления устройством.Как получить доступ к классу из 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 для .Net, но это, кажется, раздельные языки вообще, и я хочу быть в состоянии сделать все, что от одного места (питон).

-SWIG. Документация SWIG, похоже, указывает на то, что она может обрабатывать классы импорта, но, похоже, также требует, чтобы файлы кода C++ и файлы заголовков (которые у меня не были) были обернуты для использования в качестве модуля python.

Я новичок и довольно потерян здесь, поэтому любая помощь приветствуется!

EDIT:

@SvenMarnach: Я посмотрел на IronPython и был в состоянии заставить его работать с моими DLL файлы, но я хочу сделать это в Python, так как я уже делал много вещей на этом языке. Я хочу интегрировать эти DLL-функции или классы или что-то в существующие программы python.

При работе с IronPython, однако, я наткнулся назад на Python for .NET, который утверждает, что может установить .Net-осведомленность о существующих установках python ... Это работает (т.е. я могу получить доступ к файлам DLL и управлять своим устройством), если я используйте его в каталоге, в который я загрузил python для файлов .NET, но если я попробую его в каком-то другом каталоге (помня о том, чтобы добавить каталог python.net на sys.path), вы получите сообщение об ошибке ImportError: dynamic module does not define init function (initclr)

+2

Насколько мне известно, библиотеки DLL не могут содержать классы. Они могут содержать функции, а компиляторы будут манипулировать именами методов для имен функций перед тем, как поместить их в DLL. Так что это полностью зависит от языка, на котором реализованы библиотеки DLL. (Отказ от ответственности: я не знаком с .NET и платформой Windows.) –

+1

Возможно, это не относится к делу, но довольно часто dotll «dlls» на самом деле не является бинарными скомпилированными dlls , они являются байт-кодом C# с расширением dll. – aquavitae

+0

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

ответ

1

Насколько я понимаю, вы хотите использовать .NET-классы в вашем коде python. Я также не очень хорошо знаком с C# и тем, как он работает, но если я правильно понимаю, он может быть скомпилирован в DLL на Common Intermediate Language. Этот CIL - это язык программирования, определяемый инфраструктурой Common Language Infrastructure, разработанный Microsoft и основой для платформы .NET. Чтобы прочитать CIL, вы должны использовать Common Language Runtime, который в основном является компилятором Just-In-Time для машинного считываемого байтового кода. Здесь я думаю, это решение вашей проблемы. Чтобы использовать классы, определенные в DLL, которые, как мы надеемся, содержат классы в CIL, вам понадобится CLR, которая отображает CIL в байтовый код Python! У IronPython есть такой CLR-транслятор. Однако можно использовать CLR, который работает с чистым Python, часто это сопоставление может быть только одним способом (с которым я работал). Если вам нужно использовать функции, которые ожидают объекты CIL/.NET, вам понадобится CLR, которая может конвертировать между объектами CIL и Python в обоих направлениях.

Я надеюсь, что это было бы полезно. Если вам нужна дополнительная информация, я предлагаю посмотреть на documentation on the .NET integration for IronPython, как уже говорилось выше.

 Смежные вопросы

  • Нет связанных вопросов^_^