2009-07-29 16 views
13

He creado un dll usando C#. ¿Cómo se usa el dll en IronPython? Intenté agregar el dll utilizando clr.AddReference ("yxz.dll"). Pero falla. Intenté ubicar el dll en el directorio de ejecución del script de IronPython. Todavía falla diciendo que "Name xyz no se puede encontrar" al intentar referir el dll.Cómo usar un dll C# en IronPython

+1

¿Qué sucede si cambia la línea a clr.AddReference ("yxz"), ¿hace alguna diferencia? –

+0

Si el problema es que no se puede encontrar el archivo DLL, use Process Monitor de Sysinternals para identificar el problema. –

+1

fuslogvw.exe también es una buena manera de descubrir por qué no se encuentra una DLL administrada; se trata de la plataforma SDK. –

Respuesta

8

Creo que no está encontrando el archivo porque no sabe dónde buscarlo, vea here para obtener una explicación detallada de cómo funcionan las funciones clr.AddReference ...().

2

El ejemplo Creating .NET Classes Dynamically from IronPython, crea un conjunto (que luego se guarda en el disco como "DynamicAsm.dll"). Contiene una clase llamada "DynamicType", con un único método estático llamado 'test'. Este método toma cuatro enteros y los suma.

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 

Tenga en cuenta que el ejemplo se utiliza el nombre de clase en la declaración import.

+2

use 'import sys print sys.path' para determinar dónde clr.AddReference está buscando dlls – mydogisbox

+0

¿Puedo hacer esto desde el exterior? ¿O realmente tengo que importar clr y agregar la referencia al ensamblaje en mi script de IronPython? Tengo algunas asambleas aquí que me gustaría haber importado estáticamente para que estén siempre disponibles en el guión. –

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

es la forma más sencilla propuesta por Jeff en los comentarios. Esto también funciona:

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

También puede usar 'clr.AddReferenceToFileAndPath', que hace exactamente eso. –

+0

Obtengo este comportamiento solo desde la consola de IronPython. Cuando ejecuto un script, está bien. Cuando ejecuto un script, IronPython, 'sys.path' contiene una ruta absoluta a mi directorio de trabajo actual para que funcione. Cuando escribo en la consola, 'sys.path' solo incluye un' '.'' para el directorio de trabajo actual. Eso puede explicar la diferencia en el comportamiento. –

+0

Intenté esto, pero obteniendo un error: AttributeError: el objeto 'module' no tiene ningún atributo 'AddReferenceToFileAndPath' – Avis

0

Puede utilizar esta:

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

Es mejor utilizar clr.AddReferenceToFile (nombre de archivo), ya que toma una ruta relativa.

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

A continuación, puede importar las clases de importación como de costumbre:

import xxx 

o

from xxx import * 

le recomiendo que echa un vistazo a este libro, es muy útil. https://play.google.com/store/apps/details?id=com.gavin.gbook

+0

AddReferenceToFileAndPath también funciona con rutas de directorio relativas, fwiw. – EdwardGarson

0

Obtuve este comportamiento solo desde la consola de IronPython. Cuando ejecuto un script, está bien. Cuando ejecuto un script, IronPython, sys.path contiene una ruta absoluta a mi directorio de trabajo actual para que funcione. Cuando escribo en la consola, sys.path solo incluye un '.' para el directorio de trabajo actual. Eso puede explicar la diferencia en el comportamiento.

como un poco de una solución hacky, he creado un archivo 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 

A continuación, se configura un entorno IRONPYTHONSTARTUP variable con el camino absoluto a este archivo. Entonces cada vez que inicio mi consola IronPython, este script se ejecuta y mi sys.path incluye una referencia absoluta a mi directorio de trabajo actual y las llamadas subsiguientes al clr.AddReference funcionan correctamente.