2009-07-29 56 views
13

Tôi đã tạo một dll bằng C#. Làm thế nào để sử dụng dll trong IronPython. Tôi đã cố gắng để thêm dll bằng cách sử dụng clr.AddReference ("yxz.dll"). Nhưng nó không thành công. Tôi đã thử đặt dll trong thư mục thực hiện của kịch bản IronPython. Tuy nhiên nó thất bại nói rằng "Tên xyz không thể được tìm thấy" trong khi cố gắng để tham khảo các dll.Cách sử dụng C# dll trong IronPython

+1

Điều gì sẽ xảy ra nếu bạn thay đổi dòng thành clr.AddReference ("yxz"), điều đó có tạo nên sự khác biệt nào không? –

+0

Nếu vấn đề là DLL không thể được tìm thấy, sử dụng Process Monitor bởi Sysinternals để xác định những gì sai. –

+1

fuslogvw.exe cũng là một cách tốt để tìm ra lý do tại sao một DLL quản lý không tìm thấy - nó đến w/nền tảng SDK. –

Trả lời

8

Tôi nghĩ rằng nó không tìm thấy tệp vì nó không biết phải tìm kiếm ở đâu, xem here để có giải thích chi tiết về cách hoạt động của hàm clr.AddReference ...().

2

Ví dụ Creating .NET Classes Dynamically from IronPython, tạo một hội đồng (sau này được lưu vào đĩa dưới dạng "DynamicAsm.dll"). Nó chứa một lớp được gọi là "DynamicType", với một phương pháp tĩnh duy nhất được gọi là 'test'. Phương thức này lấy bốn số nguyên và cộng chúng lại với nhau.

The nice thing is that this saves "DynamicAsm.dll" to disk. You can then start an IronPython interactive interpreter session and do the following :

>>> import clr 
>>> clr.AddReference('DynamicAsm.dll') 
>>> import DynamicType 
>>> DynamicType.test(2, 3, 4, 5) 
14 

Lưu ý rằng ví dụ sử dụng tên lớp trong báo cáo import.

+2

sử dụng 'import sys print sys.path' để xác định nơi clr.AddReference đang tìm kiếm dlls – mydogisbox

+0

Tôi có thể thực sự làm điều này từ bên ngoài không? Hoặc tôi thực sự phải nhập khẩu clr và thêm tham chiếu đến lắp ráp trong kịch bản IronPython của tôi? Tôi đã có một số hội đồng ở đây mà tôi muốn nhập khẩu tĩnh để họ luôn luôn có sẵn trong kịch bản. –

8
import clr  
clr.AddReferenceToFileAndPath(r"C:\Folder\Subfolder\file.dll") 

là cách đơn giản nhất theo đề xuất của Jeff trong phần nhận xét. Điều này cũng hoạt động:

import clr 
import sys 

sys.path.append(r"C:\Folder\Subfolder") # path of dll 
clr.AddReference ("Ipytest.dll") # the dll 
import TestNamspace # import namespace from Ipytest.dll 
+3

Bạn cũng có thể sử dụng 'clr.AddReferenceToFileAndPath', thực hiện chính xác điều đó. –

+0

Tôi chỉ nhận được hành vi này từ bảng điều khiển IronPython. Khi tôi chạy một kịch bản nó là tốt. Khi tôi chạy một kịch bản lệnh IronPython, 'sys.path' chứa một đường dẫn tuyệt đối tới thư mục làm việc hiện tại của tôi để nó hoạt động. Khi tôi gõ vào giao diện điều khiển, 'sys.path' chỉ bao gồm một' '.'' cho thư mục làm việc hiện tại. Điều đó có thể giải thích sự khác biệt trong hành vi. –

+0

Tôi đã thử điều này, nhưng nhận được một lỗi: AttributeError: 'module' đối tượng không có thuộc tính 'AddReferenceToFileAndPath' – Avis

0

Bạn có thể sử dụng này:

import clr 
clr.AddReferenceToFile("yxz.dll") 
0

Nó tốt hơn để sử dụng clr.AddReferenceToFile (filename), bởi vì nó có một đường dẫn tương đối.

import clr 
clr.AddReferenceToFile("xxx.dll") 

Sau đó, bạn có thể nhập các lớp của nhập khẩu như bình thường:

import xxx 

hoặc

from xxx import * 

tôi khuyên bạn nên kiểm tra cuốn sách này, nó rất hữu ích. https://play.google.com/store/apps/details?id=com.gavin.gbook

+0

AddReferenceToFileAndPath cũng làm việc với đường dẫn thư mục tương đối, fwiw. – EdwardGarson

0

Tôi chỉ nhận được hành vi này từ bảng điều khiển IronPython. Khi tôi chạy một kịch bản nó là tốt. Khi tôi chạy một kịch bản lệnh IronPython, sys.path chứa một đường dẫn tuyệt đối tới thư mục làm việc hiện tại của tôi để nó hoạt động. Khi tôi gõ vào giao diện điều khiển, sys.path chỉ bao gồm một '.' cho thư mục làm việc hiện tại. Điều đó có thể giải thích sự khác biệt trong hành vi.

Là một chút của một giải pháp hacky, tôi đã tạo ra một tập tin fixpath.py

"""This hacky script fixes the sys.path when I run the ipy console.""" 

import sys 
import os 

sys.path.insert(0, os.getcwd()) 

del sys 
del os 

Sau đó, tôi thiết lập một môi trường biến IRONPYTHONSTARTUP với đường dẫn tuyệt đối đến tập tin này. Sau đó, bất cứ khi nào tôi bắt đầu giao diện điều khiển IronPython, tập lệnh này được chạy và sys.path của tôi bao gồm tham chiếu tuyệt đối đến thư mục làm việc hiện tại của tôi và các cuộc gọi tiếp theo đến clr.AddReference hoạt động bình thường.

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