2009-11-19 7 views
5

Ho alcuni tipi in una libreria C# che ho scritto, ad esempio:Perché non posso importare il mio tipo C# in IronPython?

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

voglio usarle in uno script IronPython:

import clr 
import sys 

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

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

Quando la linea sotto il commento accade, ottengo:

ImportError: No module named Generators 

ho verificato che il file che sto caricando è quello che mi aspetto rinominandolo e verificando lo script genera un errore quando si cerca di caricare l'assembly. Ho verificato che lo spazio dei nomi sia nell'assembly tramite Reflector. Ho anche provato a specificare un nome di classe completo per ovviare al mio problema di importazione, ad es.

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

ma ottengo:

NameError: name 'SprocGenerator' is not defined 

Anche se ho questo in C#:

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

E questo a IP:

import clr 
import sys 
from System import * 

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

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

ottengo questo errore:

NameError: global name 'GeneratorHelper' is not defined 

Cosa sto sbagliando?

+2

Quale piattaforma è SprocGenerator.dll costruito per? Il problema potrebbe essere che il processo in cui stai eseguendo il programma IronPython non è in grado di gestire "l'architettura" della DLL? Ad esempio, se stai eseguendo IronPython da una console a 32 bit, SprocGenerator.dll è stato creato per 64 bit. – Jacob

+1

@Jacob - Questo era esattamente il problema che avevo.L'uso della versione a 32 bit del mio interprete python lo ha risolto. – arviman

risposta

1

Controlla i tuoi spazi dei nomi. Il fatto che si lamenta:

ImportError: No module named Generators 

invece di:

ImportError: No module named SprocGenerator.Generators 

ci dice che ha trovato lo spazio dei nomi SprocGenerator. C'è un errore ortografico in C# o Python nello spazio dei nomi interno, Generatori?

+0

L'impostazione dello spazio dei nomi predefinito per l'assembly potrebbe avere qualche effetto sul mio problema? È impostato sul valore predefinito: "SprocGenerator" –

+0

Non ci credo. Lo spazio dei nomi predefinito dice semplicemente a Visual Studio come generare nuovi file di codice. In entrambi i casi, Reflector ti mostrerà lo spazio dei nomi in cui viene trovata la classe. Ho replicato esattamente il tuo esempio e ricevo solo un errore quando cambio lo spazio dei nomi in modo che sia diverso da quello che mostri. =/ –

+0

IronPython 2.0.3? –

5

Potresti ricevere la DLL da una posizione diversa da quella che ti aspetti? AddReferenceToFile cercherà sys.path e caricherà il primo file che trova che corrisponde a quel nome file. A seconda di dove ci si aspetta di trovare la DLL e dove potrebbe esistere prima nel percorso, si potrebbe ottenere una versione che è stata compilata in precedenza. È anche possibile fare:

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

per vedere quali tipi esistono nella DLL che si sta effettivamente ricevendo indietro o:

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

per vedere dove il file è effettivamente caricato.

0

Posizionare il gruppo in una delle posizioni specificate in sys.path. Sulla mia macchina:

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