vb.net脚本引擎 vb脚本是什么意思( 八 )


2.编译源代码
编译源代码相当简单 , 只需一条语句就搞定了:
CompilerResults compilerResults= compiler.CompileAssemblyFromSource(this.theParameters, this.SourceText);
执行后,可以从compilerResults取得以下内容:
NativeCompilerReturnValue编译结果,用于检查是否成功
Errors编译时产生的错误和警告信息
CompiledAssembly如果编译成功 , 则返回编译生成的Assembly
示例函数:
/// summary
/// 编译脚本 。编译前将清空以前的编译信息 。
/// CompilerInfo将包含编译时产生的错误信息 。
/// /summary
/// returns成功时返回True 。不成功为False 。/returns
public bool Compile()
{
this.theCompilerInfo = "";
this.isCompiled = false;
this.theCompiledAssembly = null;
this.theCompilerResults = this.theCompiler.CompileAssemblyFromSource(this.theParameters, this.SourceText);
if(this.theCompilerResults.NativeCompilerReturnValue =https://www.04ip.com/post/= 0)
{
this.isCompiled = true;
this.theCompiledAssembly = this.theCompilerResults.CompiledAssembly;
}
System.Text.StringBuilder compilerInfo = new System.Text.StringBuilder();
foreach(CompilerError err in this.theCompilerResults.Errors)
{
compilerInfo.Append(err.ToString());
compilerInfo.Append("/r/n");
}
theCompilerInfo = compilerInfo.ToString();
return isCompiled;
}
3.执行代码
使用Reflection机制就可以很方便的执行Assembly中的代码 。
我们假设编译时使用的脚本代码 this.SourceText 内容如下:
namespace test
{
public class script
{
static public void Main()
{
MessageBox.Show("Hello");
}
}
}
则相应的执行代码为:
scriptEngine.Invoke("test.script", "Main", null);
Invoke函数内容:
/// summary
/// 执行指定的脚本函数(Method) 。
/// 如果指定的类或模块名 , 以及函数(Method)、或参数不正确,将会产生VsaException/VshException例外 。
/// /summary
/// param name="__strModule"类或模块名/param
/// param name="__strMethod"要执行的函数(Method)名字/param
/// param name="__Arguments"参数(数组)/param
/// returns返回执行的结果/returns
public object Invoke(string __strModule, string __strMethod, object[] __Arguments)
{
if(!this.IsCompiled || this.theCompiledAssembly == null)
throw new System.Exception("脚本还没有成功编译");
Type __ModuleType = this.theCompiledAssembly.GetType(__strModule);
if(null == __ModuleType)
throw new System.Exception(string.Format("指定的类或模块 ({0}) 未定义 。", __strModule));
MethodInfo __MethodInfo = __ModuleType.GetMethod(__strMethod);
if(null == __MethodInfo)
throw new System.Exception(string.Format("指定的方法 ({0}::{1}) 未定义 。", __strModule, __strMethod));
try
{
return __MethodInfo.Invoke(null, __Arguments);
}
catch( TargetParameterCountException )
{
throw new System.Exception(string.Format("指定的方法 ({0}:{1}) 参数错误 。", __strModule, __strMethod));
}
catch(System.Exception e)
{
System.Diagnostics.Trace.WriteLine(string.Format("执行({0}:{1})错误: {2}", __strModule, __strMethod, e.ToString()));
return null;
}
}
VB .NET编程是否可以不依赖.NET Framework这是典型对.net构架不理解造成的!
只要是.net编程,一定使用的是.net类库,必须是同运行版本的.net支持方可运行 。而所谓的vb.net只是说编程的语言层使用的是vb语言而已 。该语言在.net构架下被编译成为IL语言(MSIL,严格说来是IL的一个子集) 。而上层的语言只是产生软件时所使用的一个不同语言规则而已 , 与IL已经没有任何相关性了 。上层语言无论是C#还是VB,甚至是Java(J#)均只适应编程人员的一个策略,与整个构造没有多大的相关性 。

推荐阅读