2009-07-29 13 views
13

Stworzyłem dll przy użyciu C#. Jak korzystać z biblioteki dll w IronPython. Próbowałem dodać dll przy użyciu clr.AddReference ("yxz.dll"). Ale zawiedzie. Próbowałem umieścić plik dll w katalogu wykonawczym skryptu IronPython. Nadal nie powiedzie się, że "Nazwa xyz nie może zostać znaleziona" podczas próby skierowania biblioteki dll.Jak używać C# dll w IronPython

+1

Co się stanie, jeśli zmienisz wiersz na clr.AddReference ("yxz"), czy to ma znaczenie? –

+0

Jeśli problem polega na tym, że nie można znaleźć biblioteki DLL, użyj Monitora procesów Sysinternals, aby wskazać, co jest nie tak. –

+1

fuslogvw.exe jest również dobrym sposobem, aby dowiedzieć się, dlaczego zarządzana biblioteka DLL nie została znaleziona - pochodzi z SDK platformy. –

Odpowiedz

8

Myślę, że nie udało się znaleźć pliku, ponieważ nie wie, gdzie go szukać, zobacz here, aby uzyskać szczegółowe wyjaśnienie, jak działają funkcje clr.AddReference ...().

2

Przykład Creating .NET Classes Dynamically from IronPython tworzy zespół (który jest później zapisywany na dysku jako "DynamicAsm.dll"). Zawiera klasę o nazwie "DynamicType", z pojedynczą statyczną metodą o nazwie "test". Ta metoda pobiera cztery liczby całkowite i dodaje je razem.

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 

Należy zauważyć, że przykład używa nazwy klasy w rachunku import.

+2

użyj 'import sys drukuj sys.ścieżka 'do określenia, gdzie clr.AddReference szuka bibliotek DLL – mydogisbox

+0

Czy mogę to zrobić z zewnątrz? Czy naprawdę muszę zaimportować clr i dodać odniesienie do zestawu w moim skrypcie IronPython? Mam tutaj kilka złożeń, które chciałbym zaimportować statycznie, aby były zawsze dostępne w skrypcie. –

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

to najprostszy sposób zaproponowany przez Jeffa w komentarzach. Działa to również:

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

Możesz również użyć 'clr.AddReferenceToFileAndPath', która dokładnie to robi. –

+0

Otrzymuję to zachowanie tylko z konsoli IronPython. Kiedy uruchamiam skrypt, wszystko jest w porządku. Kiedy uruchomię skrypt IronPython, 'sys.path' zawiera bezwzględną ścieżkę do mojego bieżącego katalogu roboczego, więc działa. Kiedy wpisuję konsolę, 'sys.path' zawiera tylko' '.'' dla bieżącego katalogu roboczego. To może wyjaśniać różnicę w zachowaniu. –

+0

Próbowałem tego, ale otrzymuję błąd: AttributeError: obiekt 'module' nie ma atrybutu 'AddReferenceToFileAndPath' – Avis

0

Można to wykorzystać:

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

Lepiej używać clr.AddReferenceToFile (filename), ponieważ zajmuje ścieżkę względną.

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

Następnie można zaimportować zajęcia przez import jak zwykle:

import xxx 

lub

from xxx import * 

polecam sprawdzić tę książkę, to bardzo pomocne. https://play.google.com/store/apps/details?id=com.gavin.gbook

+0

AddReferenceToFileAndPath działa również z względnymi ścieżkami katalogów, fwiw. – EdwardGarson

0

Mam to zachowanie tylko z konsoli IronPython. Kiedy uruchamiam skrypt, wszystko jest w porządku. Kiedy uruchomię skrypt IronPython, sys.path zawiera bezwzględną ścieżkę do mojego bieżącego katalogu roboczego, więc działa. Kiedy piszę w konsoli, sys.path zawiera tylko "." dla bieżącego katalogu roboczego. To może wyjaśniać różnicę w zachowaniu.

jako trochę hacky roztworu utworzonego pliku 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 

Następnie założyć zmienną IRONPYTHONSTARTUP bezwzględną ścieżkę do tego pliku. Następnie za każdym razem, gdy uruchamiam konsolę IronPython, ten skrypt jest uruchamiany, a mój sys.path zawiera bezwzględne odniesienie do mojego bieżącego katalogu roboczego i kolejne wywołania do clr.AddReference działają poprawnie.

Powiązane problemy