[ironpython] AddReference
在ironpython 中為使用 .net 函式庫, 需要加入一個reference給 .net assembly, 由此動作後 import進來的 namespace 才能夠被辨識
ex.
from System.IO import TextReader
class PythonFileReader(TextReader):
def __init__(self, f):
self.f = f
def Read(self, buffer, index, count):
chars = self.f.read(count).ToCharArray()
chars.CopyTo(buffer, index)
return len(chars)
import clr
clr.AddReference('System.Xml')
from System.Xml import XmlReader
f = open('test.xml')
fr = PythonFileReader(f)
xr = XmlReader.Create(fr)
while xr.read():
if xr.IsStartElement():
print xr.Name,
上面的動作是
1. 建立一個python file-like ojbect PythonFileReader 繼承自.net TextReader
2. 將 PythonFileReader 傳給.net的 api.
3. print all name of tags in 'test.xml'
在module clr中的AddReference method family有:
- clr.AddReference
- clr.AddReferenceByName
- clr.AddReferenceByPartialName
這幾個是在load 物件到 assembly. 其實這些都是Assembly.*下的一些function的wrappers,
像是 Assembly.Load, Assembly.LoadWithPartialName 等
- clr.AddReferenceToFile
- clr.AddReferenceToFileAndPath
這些則是Assembly.LoadFile的wrapper,
ex. clr.AddReferenceToFile("mydata1.dll", "mydata2")
這會從sys.path去load這些dll or exe. (即只要填該dll的相對路徑)
若要輸入絕對路徑則用 clr.AddReferenceToFileAndPath
>>> import clr
>>> for i in clr.References: print i
...
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
>>> clr.AddReference("System.Drawing")
>>> for i in clr.References: print i
...
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
從clr.References 可列出已經load的dll(mscorlib.dll, System.dll).
但python的module仍沿用先前的import方式,這是為維持python的特性。
Comments
Post a Comment