[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

Popular posts from this blog

股票評價(Stock Valuation) - 股利折現模型

openwrt feed的使用

How to convert Markdown into HTML