2009-11-19 21 views
5

Ben mesela, benim yazdığım bir C# kitaplığında bazı türleri vardır:C# türümü neden IronPython'a alamıyorum?

Bir IronPython komut bunları kullanmak istiyorum
namespace SprocGenerator.Generators 
{ 
    public class DeleteGenerator : GeneratorBase 
    { 
     public DeleteGenerator(string databaseName, string tableName) : base(databaseName, tableName) 

:

import clr 
import sys 

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

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

yorumun altında çizgi olur

, alıyorum: Ben yükleme am dosya bunu yeniden adlandırma ve senaryoyu doğrulayarak beklediğiniz olduğunu doğruladıktan

ImportError: No module named Generators 

montaj yüklemeye çalışırken hata verir. Ad alanının Reflektör ile montajda olduğunu doğruladım. Ayrıca, içe aktarma sorunumun etrafında çalışmak için tam nitelikli bir sınıf adı belirtmeyi denedim, ör.

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

Ama olsun:

NameError: name 'SprocGenerator' is not defined 

C# bu olsa bile:

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

Ve bu IP:

import clr 
import sys 
from System import * 

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

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

bu hatayı alıyorum:

NameError: global name 'GeneratorHelper' is not defined 

Neyi yanlış yapıyorum?

+2

SprocGenerator.dll hangi platform için üretilmiştir? Sorun, IronPython programını çalıştırdığınız sürecin DLL'nin "mimarisini" işleyememesi olabilir mi? Örneğin, 32-bit bir konsoldan IronPython çalıştırıyorsanız ve SprocGenerator.dll 64-bit için oluşturulmuşsa. – Jacob

+1

@Jacob - Bu benim yaşadığım problemdi.Benim python tercümanımın 32 bit sürümünü kullanmak onu düzeltti. – arviman

cevap

1

Ad alanlarınızı kontrol edin. o şikayet olması: yerine

ImportError: No module named Generators 

:

ImportError: No module named SprocGenerator.Generators 

o SprocGenerator ad buldum söyler. İç ad alanında C# veya Python'da bir yazım hatası var mı, Jeneratörler?

+0

Montaj için Varsayılan Ad Alanı ayarının benim sorunum üzerinde bir etkisi olabilir mi? Varsayılan olarak ayarlandı: "SprocGenerator" –

+0

Ben buna inanmıyorum. Varsayılan ad alanı, Visual Studio'ya yeni kod dosyaları nasıl üretileceğini bildirir. Her iki durumda da, Reflektör size sınıfın bulunduğu ad alanını gösterir. Örneğinizi tam olarak kopyaladım ve isim alanlarını gösterdiğinizden farklı olacak şekilde değiştirdiğimde hata alıyorum. =/ –

+0

IronPython 2.0.3? –

5

DLL dosyasını farklı bir yerden alıyor olabilirsiniz, sonra bekliyorsunuz? AddReferenceToFile, sys.path dosyasını arayacak ve bulduğu ilk dosyayı o dosya adıyla eşleştirecek şekilde yükleyecektir. DLL'yi nerede bulacağınıza ve yolunda daha önce nerede bulunabileceğine bağlı olarak, daha önce derlediğiniz bir sürümünü edinebilirsiniz. Ayrıca yapabilirsiniz:

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

aslında geri almak ya edilir DLL mevcut türlerini görmek için: dosyanın gerçekten yükleniyor nerede

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

görmek için.

0

Montajı sys.path belgesinde belirtilen yerlerden birisine yerleştirin. Makinem hakkında:

['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']

İlgili konular