ASP网站制作之.NET 静态加载程序集(二)
减少客户内IT专业人才缺乏带来的影响。ASP的客户员工利用浏览器进入相关的应用软件,简单易用,无需专业技术支持。正式入手下手本文:在.NET框架中,将程序集加载至使用程序域的办法有几种。每种办法利用分歧的类。您可使用上面的重载办法将程序集加载至使用程序域:
System.AppDomain类包括几种重载的Load办法。只管这些办法可用于将任何程序集乐成地加载至以后的或新的使用程序域,但它们次要仍是用于COM交互操纵。您也能够利用CreateInstance办法加载程序集。
System.Reflection.Assembly类包括两种静态重载办法:Load和LoadFrom。这两种办法因加载高低文而异。
复杂例题:解说了在一个.exe文件中挪用另外一个.exe文件的办法
usingSystem;
namespacedy_loadAsse
{
classtestclass
{
staticvoidMain(string[]args)
{
OutUsetest=newOutUse();
test.Output();
Console.ReadLine();
}
}
classOutUse
{
publicOutUse()
{
}
publicvoidOutput()
{
Console.WriteLine("testdyloadassembly");
}
}
}
以上编译乐成。为dy_loadAsse.exe,实行显现:
testdyloadassembly
放在与上面天生的loadexe.exe于统一目次下。
文件二:
usingSystem;
usingSystem.Reflection;
namespaceUse_dy_Load_Assembly
{
classLoadExe
{
staticvoidMain(string[]args)
{
//Usethefilenametoloadtheassemblyintothecurrentapplicationdomain.
Assemblya=Assembly.LoadFrom("dy_loadAsse.exe");
Type[]types2=a.GetTypes();
foreach(Typetintypes2)
{
Console.WriteLine(t.FullName);
}
//Getthetypetouse.
//TypemyType=a.GetType("OutUse");如许写总是堕落
TypemyType=a.GetType("dy_loadAsse.OutUse");
Console.WriteLine(myType.FullName);
//Getthemethodtocall.
MethodInfomymethod=myType.GetMethod("Output");
////Createaninstance.
Objectobj=Activator.CreateInstance(myType);
////Executetheadnamemethodmethod.
mymethod.Invoke(obj,null);
//实行了局为testdyloadassembly
//以下是挪用dy_loadAsse.exe中的Main办法,呈现毛病
//TypemyType=a.GetType("dy_loadAsse.testclass");
//Console.WriteLine(myType.FullName);
////Getthemethodtocall.
//MethodInfomymethod=myType.GetMethod("Main");
////////Createaninstance.
//Objectobj=Activator.CreateInstance(myType);
////////Executetheadnamemethodmethod.
//mymethod.Invoke(obj,null);
Console.ReadLine();
}
}
}
实践上不论你是.exe或dll构成的程序集都能够被加载
自界说绑定
除由编译器隐式地用来举行早期绑定以外(指virtual办法,接口等相干完成的绑定),反射还能够在代码中显式地用来完成早期绑定。大众言语运转库撑持多种编程言语,但这些言语的绑定例则各不不异。在初期绑定的情形下,代码天生器能够完整把持此绑定。可是,当经由过程反射举行早期绑准时,必需用自界说绑定来把持绑定。Binder类供应了对成员选择和挪用的自界说把持。
使用自界说绑定,您能够在运转时加载程序集,猎取有关该程序会合范例的信息,然后对该范例挪用办法或会见该范例的字段或属性。假如您在编译时(比方当工具范例依附于用户输出时)不晓得工具的范例,就能够利用这类办法。
usingSystem;
namespacedy_loaddll
{
publicclassHelloWorld
{
//ConstantHelloWorldstring.
privateconstStringm_helloWorld="HelloWorld";
//Defaultpublicconstructor.
publicHelloWorld()
{
}
//Print"HelloWorld"plusthepassedtext.
publicvoidPrintHello(Stringtxt)
{
//OutputtotheConsole.
Console.WriteLine(m_helloWorld+""+txt);
}
}
}
编纂天生dy_loaddll.dll,与LoadExe.exe在统一的目次上面。
usingSystem;
usingSystem.Reflection;
namespaceUse_dy_Load_Assembly
{
classLoadExe
{
staticvoidMain(string[]args)
{
//Usethefilenametoloadtheassemblyintothecurrentapplicationdomain.
Assemblya=Assembly.LoadFrom("dy_loaddll.dll");
Type[]types2=a.GetTypes();
foreach(Typetintypes2)
{
Console.WriteLine(t.FullName);
}
//Getthetypetouse.
//TypemyType=a.GetType("");如许写总是堕落由于下面的dll加了定名空间
TypemyType=a.GetType("dy_loaddll.HelloWorld");
//TypemyType=a.GetType("HelloWorld");
Console.WriteLine(myType.FullName);
////Getthemethodtocall.
MethodInfoprintMethod=myType.GetMethod("PrintHello");
//CreateaninstanceoftheHelloWorldclass.
Objectobj=Activator.CreateInstance(myType);
//Createtheargsarray.
Object[]test=newObject;
//Setthearguments.
test="FromCSharpLateBound";
//InvokethePrintHellomethod.
printMethod.Invoke(obj,test);
Console.ReadLine();
}
}
}
固然我们不由要成绩,假如办法重载,假如是属性。又该怎样办??
/查相干的msdn,
ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpcondynamicallyloadingusingtypes.htm#cpcondynamicallyloadingusingtypes
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemTypeClassInvokeMemberTopic.htm
想法是和程序员的想法不一样的.至于为什么.大家去想一想.跟心理学有关的 学习是为了用的,是为了让你的程序产生价值,把握住这个原则会比较轻松点。除此之外,课外时间一定要多参加一些社会实践活动,来锻炼自己的能力。 下载一个源代码,然后再下载一个VBScript帮助,在源代码中遇到不认识的函数或是其他什么程序,都可以查帮助进行解决,这样学习效率很高。 Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点) 如何学好ASP,以前也有人问过,把回答给你转过来看看能否对你有帮助: 那么,ASP.Net有哪些改进呢? Session:这个存储跟客户端会话过程的数据,默认20分钟失效 它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
页:
[1]