2009-11-19 13 views
5

Mam kilka typów w C# biblioteki pisałem, np:Dlaczego nie mogę zaimportować mojego C# do IronPython?

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

chcę je wykorzystać w skrypcie IronPython:

import clr 
import sys 

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

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

Gdy linia pod komentarzem dzieje, mam:

ImportError: No module named Generators 

i sprawdzeniu, czy plik wczytuję to, czego można oczekiwać przez zmianę jego nazwy i weryfikacji skrypt wygeneruje błąd podczas próby załadowania montaż. Sprawdziłem, czy przestrzeń nazw znajduje się w zespole za pośrednictwem reflektora. Próbowałem również określić w pełni kwalifikowaną nazwę klasy, aby obejść problem z importowaniem, np.

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

Ale otrzymuję:

NameError: name 'SprocGenerator' is not defined 

Nawet jeśli mam to w C#:

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

I to w IP:

import clr 
import sys 
from System import * 

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

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

otrzymuję ten błąd:

NameError: global name 'GeneratorHelper' is not defined 

Co robię źle?

+2

Na jakiej platformie zbudowany jest program SprocGenerator.dll? Czy problem może polegać na tym, że proces, w którym używasz programu IronPython, nie może obsłużyć "architektury" biblioteki DLL? Na przykład, jeśli używasz IronPython z 32-bitowej konsoli, a SprocGenerator.dll jest zbudowany na 64-bit. – Jacob

+1

@Jacob - To był dokładnie ten problem, który miałem.Użycie 32-bitowej wersji mojego interpretera python naprawiło to. – arviman

Odpowiedz

1

Sprawdź swoje przestrzenie nazw. Fakt, że narzeka:

ImportError: No module named Generators 

zamiast:

ImportError: No module named SprocGenerator.Generators 

mówi nam, że znalazł nazw SprocGenerator. Czy istnieje błąd ortograficzny w C# lub Pythonie w wewnętrznej przestrzeni nazw, Generatory?

+0

Czy domyślne ustawienie obszaru nazw zespołu może mieć jakiś wpływ na mój problem? Jest ustawiony domyślnie: "SprocGenerator" –

+0

Nie wierzę w to. Domyślna przestrzeń nazw mówi Visual Studio, jak generować nowe pliki kodu. Tak czy inaczej, Reflector pokaże ci przestrzeń nazw, w której znajduje się klasa. Dokładnie zreplikowałem Twój przykład i dostałem tylko błąd, gdy zmieniłem przestrzenie nazw, które różnią się od tego, co pokazujesz. =/ –

+0

IronPython 2.0.3? –

5

Czy możesz odebrać bibliotekę DLL z innej lokalizacji, niż się spodziewasz? AddReferenceToFile przeszuka sys.path i załaduje pierwszy znaleziony plik, który pasuje do tej nazwy. W zależności od tego, gdzie spodziewasz się znaleźć DLL i gdzie może istnieć wcześniej na ścieżce, możesz otrzymać wersję, którą wcześniej skompilowałeś. Można również zrobić:

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

zobaczyć jakie typy występują w DLL, które są faktycznie Wracając czyli

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

zobaczyć, gdzie plik jest faktycznie ładowane z.

0

Umieść zespół w jednej z lokalizacji określonych w sys.path. Na mojej maszynie:

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

Powiązane problemy