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#)均只适应编程人员的一个策略,与整个构造没有多大的相关性 。
推荐阅读
- 奥特曼格斗6游戏,奥特曼格斗6游戏怎么玩
- .net开发教程pdf下载地址,net 开发
- 三琪药房公众号关注,三奇药业
- qq安卓5g在线可以调吗,安卓怎么5g在线
- c语言怎么计算ln函数 c语言ln函数怎么写
- 出来chatgpt学雅思,考完雅思出国就能听懂吗
- 投诉短视频内容是什么,投诉短视频平台去哪个部门
- ppt如何做模糊效果,ppt如何模糊图片内容
- 单独安装VB.NET 单独安装下水道多少钱