2009-11-19 30 views
5

Tôi có một số loại trong một thư viện C# tôi đã viết, ví dụ:Tại sao tôi không thể nhập loại C# của mình vào IronPython?

namespace SprocGenerator.Generators 
{ 
    public class DeleteGenerator : GeneratorBase 
    { 
     public DeleteGenerator(string databaseName, string tableName) : base(databaseName, tableName) 

Tôi muốn sử dụng chúng trong một kịch bản IronPython:

import clr 
import sys 

clr.AddReferenceToFile("SprocGenerator.dll") 
# problem happens here: 
from SprocGenerator.Generators import * 

generator = DeleteGenerator("a", "b") 

Khi dòng dưới comment xảy ra, tôi nhận được:

ImportError: No module named Generators 

Tôi đã xác minh rằng tệp tôi đang tải là những gì tôi mong đợi bằng cách đổi tên tệp và xác minh tập lệnh sẽ phát ra lỗi khi cố gắng tải cụm. Tôi đã xác minh không gian tên nằm trong assembly thông qua Reflector. Tôi cũng đã cố gắng chỉ định một tên lớp đủ điều kiện để giải quyết vấn đề nhập của tôi, ví dụ:

generator = SprocGenerator.Generators.DeleteGenerator("a", "b") 

Nhưng tôi nhận được:

NameError: name 'SprocGenerator' is not defined 

Thậm chí nếu tôi có điều này trong C#:

namespace SprocGenerator 
{ 
    public static class GeneratorHelper 
    { 
     public static string GetTableAlias(string tableName) 

Và điều này trong IP:

import clr 
import sys 
from System import * 

clr.AddReferenceToFile("SprocGenerator.dll") 
from SprocGenerator import * 

print "helper = " + GeneratorHelper.GetTableAlias("companyBranch") 

tôi nhận được lỗi này:

NameError: global name 'GeneratorHelper' is not defined 

Tôi đang làm gì sai?

+2

SprocGenerator.dll được xây dựng trên nền tảng nào? Có thể vấn đề là quá trình mà bạn đang chạy chương trình IronPython không thể xử lý "kiến trúc" của DLL? Ví dụ, nếu bạn đang chạy IronPython từ một giao diện điều khiển 32-bit, và SprocGenerator.dll được xây dựng cho 64-bit. – Jacob

+1

@Jacob - Đây chính là vấn đề tôi gặp phải.Sử dụng phiên bản 32 bit của trình thông dịch python của tôi đã sửa nó. – arviman

Trả lời

1

Kiểm tra không gian tên của bạn. Thực tế là nó than phiền:

ImportError: No module named Generators 

thay vì:

ImportError: No module named SprocGenerator.Generators 

cho chúng ta biết nó tìm thấy không gian tên SprocGenerator. Có lỗi chính tả trong C# hoặc Python trong không gian tên bên trong, Máy phát điện?

+0

Cài đặt Không gian tên mặc định cho assembly có thể ảnh hưởng đến vấn đề của tôi không? Nó được đặt thành mặc định: "SprocGenerator" –

+0

Tôi không tin như vậy. Không gian tên mặc định chỉ cho Visual Studio biết cách tạo các tệp mã mới. Dù bằng cách nào, Reflector sẽ cho bạn thấy không gian tên nơi lớp được tìm thấy. Tôi đã sao chép chính xác ví dụ của bạn và tôi chỉ gặp lỗi khi tôi thay đổi không gian tên khác với những gì bạn hiển thị. =/ –

+0

IronPython 2.0.3? –

5

Bạn có thể chọn DLL từ một vị trí khác sau đó bạn đang mong đợi? AddReferenceToFile sẽ tìm kiếm tệp sys.path và tải tệp đầu tiên mà nó tìm thấy khớp với tên tệp đó. Tùy thuộc vào nơi bạn mong đợi để tìm DLL và nơi nó có thể tồn tại trước đó trên đường dẫn bạn có thể nhận được một phiên bản mà bạn đã biên dịch trước đó. Bạn cũng có thể làm:

dir(clr.LoadAssemblyFromFile('SprocGenerator.dll')) 

để xem những loại tồn tại trong DLL mà bạn đang thực sự lấy lại hoặc:

clr.LoadAssemblyFromFile('test.dll').CodeBase 

để xem nơi các tập tin thực sự được nạp từ.

0

Đặt hội đồng ở một trong các vị trí được chỉ định trong sys.path. Trên máy của tôi:

['C:\Windows\system32', 'C:\Program Files (x86)\IronPython 2.6\Lib', 'C:\Program Files (x86)\IronPython 2.6\DLLs', 'C:\Program Files (x86)\IronPython 2.6', 'C:\Program Files (x86)\IronPython 2.6\lib\site-packages']

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