2009-07-29 19 views
13

Ho creato una dll utilizzando C#. Come si usa la DLL in IronPython. Ho provato ad aggiungere la DLL usando clr.AddReference ("yxz.dll"). Ma fallisce. Ho provato a mettere la DLL nella directory di esecuzione dello script IronPython. Ancora non riesce affermando che "Nome xyz non può essere trovato" durante il tentativo di riferirsi alla DLL.Come utilizzare una dll C# in IronPython

+1

Cosa succede se si modifica la riga in clr.AddReference ("yxz"), questo fa alcuna differenza? –

+0

Se il problema è che la DLL non può essere trovata, utilizzare Process Monitor di Sysinternals per individuare cosa non funziona. –

+1

fuslogvw.exe è anche un buon modo per capire perché una DLL gestita non viene trovata - viene fornita con la piattaforma SDK. –

risposta

8

Penso che non riesca a trovare il file perché non sa dove cercarlo, vedere here per una spiegazione dettagliata su come funzionano le funzioni clr.AddReference ...().

2

L'esempio Creating .NET Classes Dynamically from IronPython crea un assembly (che viene successivamente salvato su disco come "DynamicAsm.dll"). Contiene una classe chiamata "DynamicType", con un unico metodo statico chiamato "test". Questo metodo accetta quattro numeri interi e li somma insieme.

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 

Si noti che l'esempio utilizza il nome della classe nella dichiarazione import.

+2

usa 'importa sys sys di stampa.path' per determinare dove clr.AddReference sta cercando dll – mydogisbox

+0

Posso davvero farlo dall'esterno? O devo davvero importare clr e aggiungere il riferimento all'assembly nel mio script IronPython? Qui ho alcuni assembly che mi piacerebbe importare staticamente in modo che siano sempre disponibili nello script. –

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

è il modo più semplice proposto da Jeff nei commenti. Questo funziona anche:

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

Puoi anche usare 'clr.AddReferenceToFileAndPath', che fa esattamente questo. –

+0

Ricevo questo comportamento solo dalla console IronPython. Quando eseguo uno script va bene. Quando eseguo uno script su IronPython, 'sys.path' contiene un percorso assoluto per la mia directory di lavoro corrente in modo che funzioni. Quando scrivo la console, 'sys.path' include solo un' '.'' per la directory di lavoro corrente. Questo potrebbe spiegare la differenza di comportamento. –

+0

Ho provato questo, ma ricevendo un errore: AttributeError: l'oggetto 'module' non ha attributo 'AddReferenceToFileAndPath' – Avis

0

È possibile utilizzare questo:

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

E 'meglio usare clr.AddReferenceToFile (nome del file), perché ci vuole un percorso relativo.

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

Quindi è possibile importare le classi da importazione come al solito:

import xxx 

o

from xxx import * 

vi consiglio di controllare questo libro, è molto utile. https://play.google.com/store/apps/details?id=com.gavin.gbook

+0

AddReferenceToFileAndPath funziona anche con percorsi di directory relativi, fwiw. – EdwardGarson

0

Ho ottenuto questo comportamento solo dalla console IronPython. Quando eseguo uno script va bene. Quando eseguo uno script su IronPython, sys.path contiene un percorso assoluto alla mia attuale directory di lavoro, quindi funziona. Quando scrivo la console, sys.path include solo un '.' per la directory di lavoro corrente. Questo potrebbe spiegare la differenza di comportamento.

come un po 'di una soluzione hacky, ho creato un file 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 

Poi ho creato un ambiente IRONPYTHONSTARTUP variabile con il percorso assoluto per questo file. Quindi ogni volta che avvio la mia console IronPython, questo script viene eseguito e il mio sys.path include un riferimento assoluto alla mia attuale directory di lavoro e le successive chiamate a clr.AddReference funzionano correttamente.

Problemi correlati