NET网页编程之你必要分明的.NET底层开辟手艺--2(反射,静态编译)
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。反射是静态猎取程序集的元数据的一种手艺,这句话是做.NET程序员口试标题的一个的谜底,你可选择记着它,就比如高中生物学内里讲到的细胞的布局的课程时,细胞由细胞膜,细胞质和细胞核构成。依据做程序的履历,Neveraskwhy不是好习气,即便是微软的API,偶然候违背了挪用商定,也会很抓狂。请看上面这一段代码
Assemblyassembly=Assembly.GetExecutingAssembly();
objectentryForm=Activator.CreateInstance(formBaseType)asForm;
entryForm.MdiParent=this;
entryForm.Show();
entryForm.Activate();
代码的寄义对照复杂,从以后程序会合创立formBaseType范例,并挪用它的办法。从办法名下去看,也许能够看出,这是一段MDI创立child子窗体,并显现子窗体的代码。
这段小代码,也是插件式框架的基础思绪,请参考《ManagementConsole工具办理类软件通用开辟框架(开放源码)》中的例子来体味它的用途。
在ERP/MIS体系中,使用反射的例子,其实是太多了。数据会见接口InventoryMovementDAL,借助于反射,来查找并挪用它的完成类;窗体也它的子窗体借助于反射来猎取属性,传送值;ERP体系的全部框架,也是借助于反射搭建起来.
看上面的图,ERP的三个模块Paradox.ERP.SystemAdministration,Paradox.ERP.Engineering,Paradox.ERP.Inventory被Paradox.Framework.Kernal反射挪用,假如再写一个Paradox.ERP.Sales的发卖模块,几近不必要修改,就能够让它被框架挪用。
静态编译的例子,是使用到一个人为体系中.请看图
关于怎样剖析人为的formular公式,有多少种举措,这里使有的是静态编译的办法。把每个人为项当作是一个范例class的属性,Formular的内容则放到一个办法中往,当做表达式盘算求职,最初使用反射,前往各属性的值便可。
publicclassFormularCalculation
{
publicstaticobjectBuild(string[]items,stringformular)
{
stringnameSpace="A";
stringclassName="FormularCalculation";
stringmethodName="Run";
CSharpCodeProvidercompiler=newCSharpCodeProvider();
CompilerParametersparas=newCompilerParameters();
paras.GenerateExecutable=false;
paras.GenerateInMemory=true;
StringBuilderclassSrc=newStringBuilder();
classSrc.Append("usingSystem;"+Environment.NewLine);
classSrc.Append("namespace"+nameSpace+"{"+Environment.NewLine);
classSrc.Append("publicclass"+className+"{"+Environment.NewLine);
foreach(stringiteminitems)
{
classSrc.Append("publicdecimal"+item+";"+Environment.NewLine);
}
classSrc.Append("publicvoidRun(){基础人为=5000;"+Environment.NewLine);
string[]format=Regex.Split(formular,Environment.NewLine);
foreach(stringpropinformat)
{
classSrc.Append(prop+";"+Environment.NewLine);
}
classSrc.Append("}"+Environment.NewLine);
classSrc.Append("}"+Environment.NewLine);
classSrc.Append("}"+Environment.NewLine);
stringsource=classSrc.ToString();
CompilerResultsresult=compiler.CompileAssemblyFromSource(paras,source);
CompilerErrorCollectionerror=result.Errors;
Assemblyassembly=result.CompiledAssembly;
objecteval=assembly.CreateInstance(nameSpace+"."+className);
MethodInfomethod=eval.GetType().GetMethod(methodName);
objectreobj=method.Invoke(eval,null);
returneval;
}
}
挪用办法以下
string[]items={"应发算计","基础人为","奖金","福利费","扣款算计","社保","税","实发算计","应税所得额"};
stringformular=@”应发算计=基础人为+奖金+福利费-扣款算计;
扣款算计=社保+税+应税所得额;
实发算计=应发算计-扣款算计;";
objectobj=FormularCalculation.Build(items,formular);
Typetype=obj.GetType();
foreach(PropertyInfofiintype.GetProperties(BindingFlags.NonPublic|BindingFlags.Public
|BindingFlags.Instance|BindingFlags.DeclaredOnly))
{
stringvalue=fi.Name;//取到盘算后的各个属性的值
}
静态编译还使用于软件的加密,在内存中发生加密程序的源代码,静态编译并运转,检测是不是切合license受权。
有专家说:java不是跨平台,java就是平台,这很好的定义了java的特点。有了java,你只需要等待java平台在新平台上移植。这还不错吧!只是,java不是一个平台,而是多个平台。你需要在这个java平台移植到另一个java平台。 碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。 由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。 使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。 是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。 那么,ASP.Net有哪些改进呢? 这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。 对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。 目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
页:
[1]