要利用.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ù)....
新聞熱點
疑難解答
圖片精選