|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
有专家说:java不是跨平台,java就是平台,这很好的定义了java的特点。有了java,你只需要等待java平台在新平台上移植。这还不错吧!只是,java不是一个平台,而是多个平台。你需要在这个java平台移植到另一个java平台。代码的静态编译并实行是一个.NET平台供应给我们的很壮大的工具用以天真扩大(固然是面临外部开辟职员)庞大而没法预算的逻辑,并经由过程一些分外的代码来扩大我们已有的使用程序。这在很年夜水平上给我们供应了别的一种扩大的体例(固然这其实不能算是严厉意义上的扩大,但最少为我们供应了一种思绪)。
静态代码实行能够使用在诸如模板天生,外加逻辑扩大等一些场所。一个复杂的例子,为了网站那的呼应速率,HTML静态页面常常是我们最好的选择,但基于数据驱动的网站常常又很难用静态页面完成,那末将静态页面熟成html的事情也许就是一个很好的使用场所。别的,关于一些模板的套用,我们一样能够用它来做。别的这自己也是插件编写的体例。
最基础的静态编译
.Net为我们供应了很壮大的撑持来完成这统统我们能够往做的基本,次要使用的两个定名空间是:System.CodeDom.Compiler和Microsoft.CSharp或Microsoft.VisualBasic。别的还必要用到反射来静态实行你的代码。静态编译并实行代码的道理实在在于将供应的源代码交予CSharpCodeProvider来实行编译(实在和CSC没甚么两样),假如没有任何编译毛病,天生的IL代码会被编译成DLL寄存于于内存并加载在某个使用程序域(默许为以后)内并经由过程反射的体例来挪用其某个办法大概触发某个事务等。之以是说它是插件编写的一种体例也恰是由于与此,我们能够经由过程事后界说好的托言来构造和扩大我们的程序并将其交还给主程序往触发。一个基础的静态编译并实行代码的步骤包含:
1.将要被编译和实行的代码读进并以字符串体例保留
2.声明CSharpCodeProvider工具实例
3.挪用CSharpCodeProvider实例的CompileAssemblyFromSource办法编译
4.用反射天生被天生工具的实例(Assembly.CreateInstance)
5.挪用其办法
以下代码片断包括了完全的编译和实行历程:- //getthecodetocompilestringstrSourceCode=this.txtSource.Text;//1.CreateanewCSharpCodePrivoderinstanceCSharpCodeProviderobjCSharpCodePrivoder=newCSharpCodeProvider();//2.SetstheruntimecompilingparametersbycratinganewCompilerParametersinstanceCompilerParametersobjCompilerParameters=newCompilerParameters();objCompilerParameters.ReferencedAssemblies.Add("System.dll");objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");objCompilerParameters.GenerateInMemory=true;//3.CompilerResults:ComplilethecodesnippetbycallingamethodfromtheproviderCompilerResultscr=objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters,strSourceCode);if(cr.Errors.HasErrors){stringstrErrorMsg=cr.Errors.Count.ToString()+"Errors:";for(intx=0;x<cr.Errors.Count;x++){strErrorMsg=strErrorMsg+"
- Line:"+cr.Errors[x].Line.ToString()+"-"+cr.Errors[x].ErrorText;}this.txtResult.Text=strErrorMsg;MessageBox.Show("Therewerebuilderros,pleasemodifyyourcode.","CompilingError");return;}//4.InvokethemethodbyusingReflectionAssemblyobjAssembly=cr.CompiledAssembly;objectobjClass=objAssembly.CreateInstance("Dynamicly.HelloWorld");if(objClass==null){this.txtResult.Text="Error:"+"Couldntloadclass.";return;}object[]objCodeParms=newobject[1];objCodeParms[0]="Allan.";stringstrResult=(string)objClass.GetType().InvokeMember("GetTime",BindingFlags.InvokeMethod,null,objClass,objCodeParms);this.txtResult.Text=strResult;
复制代码 <p>据说很厉害,甚至可以把C#也干掉^_^,不过也很复杂,本来C++已经够复杂的。有人甚至还提出把这个东东引进标准,我觉得基本上不可能的。 |
|