要利用.net語言(例如:c# vb.net)開發(fā)自己的腳本語言必須實現(xiàn)2步:
1.能夠動態(tài)編譯.net 源代碼
2.動態(tài)調(diào)用.net組件
首先我們介紹下動態(tài)條用.net組件
1.新建1個工程作為組件接口dynamicinterface
創(chuàng)建新的類:
using system;
namespace dynamicinterface
{
 public interface idynamic {
  string getstring();
 }
}
2.新建1個工程作為需要動態(tài)調(diào)用的組件dynamicclass
引用dynamicinterface
創(chuàng)建新的類:
using system;
namespace dynamiccls
{
 public class dynamicclass:dynamicinterface.idynamic //實現(xiàn)接口
 {
  public dynamicclass()
  {
   
  }
  #region idynamic 成員
  public string getstring() {
   // todo:  添加 dynamicclass.getstring 實現(xiàn)
   return "hello world huhong";
  }
  #endregion
 }
3.新建1個工程來動態(tài)調(diào)用dynamicclass
using system;
using system.reflection;
using system.threading;
namespace dynamicreference
{
 
 class dynamicreference
 {
  /// <summary>
  /// 應(yīng)用程序的主入口點。
  /// </summary>
  [stathread]
  static void main(string[] args)
  {
   
   string [email protected]"c:/dynamicclass.dll";
   thread.getdomain().assemblyload+=new assemblyloadeventhandler(dynamicreference_assemblyload);
   thread.getdomain().assemblyresolve+=new resolveeventhandler(dynamicreference_assemblyresolve);
   assembly asm=system.reflection.assembly.loadfile(dllfilename);
   type type=asm.gettype("dynamiccls.dynamicclass",true);
   object oh=activator.createinstance(type);
   methodinfo mi = type.getmethod("getstring");
   console.writeline(mi.invoke(oh,null).tostring()); //利用反射機(jī)制運行
   dynamicinterface.idynamic id=(dynamicinterface.idynamic)oh; //利用接口運行
   console.writeline(id.getstring());
  }
  private static void dynamicreference_assemblyload(object sender, assemblyloadeventargs args) {
   console.writeline("加載1個組件:"+args.loadedassembly.fullname );
  }
  private static assembly dynamicreference_assemblyresolve(object sender, resolveeventargs args) {
   console.writeline("組件解析失敗!");
   return null;
  }
 }
}
未完待續(xù)....
新聞熱點
疑難解答
圖片精選