2012-03-19 52 views
6

Tôi có một tập tin .dll hữu ích với các lớp được thiết kế để điều khiển thiết bị bên ngoài được kết nối với máy tính để bàn của tôi qua ethernet. Tôi muốn nhập các lớp này vào python và sử dụng các hàm/biến thành viên của chúng, v.v. để điều khiển thiết bị.cách truy cập một lớp từ một dll trong python?

Tôi đã xem xét một số tùy chọn bao gồm:

-tyty (có vẻ hoạt động tốt cho các chức năng chứ không phải lớp). Ở đây "DotNet \ Aerotech.Ensemble.dll" là thư viện dll của tôi và "Mạng" là một lớp trong thư viện đó có chức năng thành viên "Kết nối". Tải thư viện, nhưng tôi không thể truy cập vào các lớp ...

>>> 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 cho Net nhưng dường như là ngôn ngữ riêng biệt hoàn toàn và tôi muốn để có thể làm tất cả mọi thứ từ một nơi (python).

-SWIG. Tài liệu SWIG dường như chỉ ra rằng nó có thể xử lý các lớp nhập khẩu, nhưng cũng có vẻ như yêu cầu mã C++ và các tệp tiêu đề (mà tôi không có) được gói để sử dụng như một mô-đun python.

Tôi là người mới bắt đầu và khá lạc lối ở đây nên mọi trợ giúp đều được đánh giá cao!

EDIT:

@SvenMarnach: Tôi đã có một cái nhìn tại IronPython và đã có thể có được nó làm việc với các tập tin dll của tôi, nhưng tôi muốn làm điều này trong Python vì tôi đã làm rất nhiều thứ bằng ngôn ngữ đó. Tôi muốn tích hợp các chức năng dll hoặc các lớp hoặc bất cứ điều gì vào các chương trình python hiện có.

Khi nhận IronPython hoạt động, tuy nhiên, tôi đã vấp phải Python for .NET để xác nhận có khả năng cài đặt .Net nhận thức cho cài đặt python hiện có ... Tác vụ này (nghĩa là tôi có thể truy cập tệp dll và điều khiển thiết bị của mình) sử dụng nó trong thư mục mà tôi đã tải về python cho các tệp .NET, nhưng nếu tôi thử nó trong một số thư mục khác (nhớ để chắp thêm thư mục python.net vào sys.path), bạn sẽ gặp lỗi ImportError: dynamic module does not define init function (initclr)

+2

Theo như tôi biết, các tệp DLL không được "chứa các lớp". Chúng có thể chứa các hàm, và các trình biên dịch sẽ mangle các tên phương thức để đặt tên các hàm trước khi đưa chúng vào một DLL. Vì vậy, điều này hoàn toàn phụ thuộc vào ngôn ngữ các DLL được thực hiện. (Disclaimer: Tôi không quen với .NET và nền tảng Windows.) –

+1

Điều này có thể không có liên quan, nhưng khá thường xuyên dotnet "dlls" không thực sự nhị phân biên dịch dlls , chúng là C# bytecode với phần mở rộng dll. – aquavitae

+0

http: // stackoverflow.com/questions/2082159/how-to-export-c-sharp-phương pháp – cons0ul

Trả lời

1

Theo tôi hiểu bạn muốn sử dụng các lớp .NET trong mã python của bạn. Tôi cũng không phải là rất quen thuộc với C# và cách nó hoạt động nhưng nếu tôi hiểu nó đúng nó có thể được biên dịch thành một DLL trong ngôn ngữ trung gian chung. CIL này là ngôn ngữ lập trình được xác định bởi Cơ sở hạ tầng ngôn ngữ chung được phát minh bởi microsoft và cơ sở cho khuôn khổ .NET. Để đọc CIL, bạn phải sử dụng một ngôn ngữ chung Runtime mà về cơ bản là một trình biên dịch Just-In-Time để có thể đọc được mã byte. Ở đây tôi nghĩ là giải pháp cho vấn đề của bạn. Để sử dụng các lớp được định nghĩa trong DLL mà hy vọng chứa các lớp trong CIL, bạn sẽ cần một CLR ánh xạ CIL tới mã byte Python! IronPython có một bản đồ CLR như vậy. Tuy nhiên nó có thể sử dụng một CLR mà làm việc với Python tinh khiết thường những người lập bản đồ có thể là một cách duy nhất (một trong những tôi đã làm việc với). Nếu bạn cần sử dụng các hàm mà mong đợi các đối tượng CIL/.NET, bạn sẽ cần một CLR có thể chuyển đổi giữa các đối tượng CIL và Python theo cả hai cách.

Tôi hy vọng iwas này hữu ích. Nếu bạn cần thêm thông tin, tôi khuyên bạn nên xem documentation on the .NET integration for IronPython như đã nêu ở trên.

Các vấn đề liên quan