2009-07-29 2 views
13

Я создал dll с помощью C#. Как использовать DLL в IronPython. Я попытался добавить dll, используя clr.AddReference ("yxz.dll"). Но это терпит неудачу. Я попытался разместить dll в каталоге выполнения скрипта IronPython. Тем не менее он не заявляет, что «Имя xyz не может быть найдено» при попытке ссылаться на dll.Как использовать C# dll в IronPython

+1

Что произойдет, если вы измените строку на clr.AddReference ("yxz"), не имеет значения? –

+0

Если проблема в том, что DLL не найдена, используйте Process Monitor от Sysinternals, чтобы определить, что не так. –

+1

fuslogvw.exe также является хорошим способом выяснить, почему управляемая DLL не найдена - она ​​приходит с платформой SDK. –

ответ

8

Я думаю, что это не удается найти файл, потому что он не знает, где его искать, см. here для подробного объяснения того, как работают функции clr.AddReference ...().

2

В примере Creating .NET Classes Dynamically from IronPython создается сборка (которая впоследствии сохраняется на диске как «DynamicAsm.dll»). Он содержит класс под названием «DynamicType», с одним статическим методом «test». Этот метод принимает четыре целых числа и объединяет их.

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 

Обратите внимание, что в данном примере используется имя класса в import заявлении.

+2

использовать 'import sys print sys.path', чтобы определить, где clr.AddReference ищет dlls – mydogisbox

+0

Могу ли я на самом деле делать это снаружи? Или мне действительно нужно импортировать clr и добавить ссылку на сборку в моем скрипте IronPython? У меня есть несколько сборок здесь, которые я бы хотел импортировать статически, чтобы они всегда были доступны в скрипте. –

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

- это самый простой способ, предложенный Джеффом в комментариях. Это также работает:

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

Вы также можете использовать 'clr.AddReferenceToFileAndPath', который делает именно это. –

+0

Я получаю это поведение только от консоли IronPython. Когда я запускаю сценарий, все в порядке. Когда я запускаю скрипт, IronPython, 'sys.path' содержит абсолютный путь к моему текущему рабочему каталогу, так что он работает. Когда я вхожу в консоль, 'sys.path' включает только'..'' для текущего рабочего каталога. Это может объяснить разницу в поведении. –

+0

Я пробовал это, но получаю сообщение об ошибке: AttributeError: объект 'module' не имеет атрибута 'AddReferenceToFileAndPath' – Avis

0

Вы можете использовать это:

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

Это лучше использовать clr.AddReferenceToFile (имя файла), потому что он принимает относительный путь.

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

Затем вы можете импортировать классы импорта как обычно:

import xxx 

или

from xxx import * 

Я рекомендую вам проверить эту книгу, это очень полезно. https://play.google.com/store/apps/details?id=com.gavin.gbook

+0

AddReferenceToFileAndPath также работает с относительными путями каталогов, fwiw. – EdwardGarson

0

Я получил это поведение только с консоли IronPython. Когда я запускаю сценарий, все в порядке. Когда я запускаю скрипт, IronPython, sys.path содержит абсолютный путь к моему текущему рабочему каталогу, так что он работает. Когда я вхожу в консоль, sys.path включает только '.' для текущего рабочего каталога. Это может объяснить разницу в поведении.

Как немного в Hacky решение, я создал файл 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 

Тогда я создать переменную окружения IRONPYTHONSTARTUP на абсолютный путь к этому файлу. Затем, когда я запускаю свою консоль IronPython, этот сценарий запускается, а мой sys.path включает абсолютную ссылку на мой текущий рабочий каталог и последующие вызовы на clr.AddReference.

Смежные вопросы