vb.netjs脚本 vbs脚本代码大全

vb.net 如何运行javascript既然引用了COM组件,就可以直接使用了,无需用CreateObject创建 。
Dim ScriptControl As New MSScriptControl.ScriptControl
ScriptControl.Language = "JavaScript"'设置语言种类
ScriptControl.AddCode("function TestFunc(){return 'Hello world!'}")'添加脚本代码
MsgBox(ScriptControl.Run("TestFunc"))'显示一下那段脚本的返回值(这里你将看到Hello world!字符)
如何在.NET中实现脚本引擎NET 本身提供vb.netjs脚本了强大的脚本引擎,可以直接使用.NET CLR的任何编程语言作为脚本语言 , 如VB.NET、C#、JScript, J#等等 。使用脚本引擎,我们可以动态生成任意表达式、或动态导入任意脚本文件,并在任意时候执行 。
经实践发现,我们可以使用至少两种不同的方式在.NET中使用脚本引擎vb.netjs脚本:VsaEngine和CodeDom 。
其实,CodeDom不能算是真正的脚本引擎,它实际上是编译器 。但是我们完全可以利用CodeDom来模拟脚本引擎 。
使用Emit方法也能达到动态生成可执行代码的目的,而且Emit生成的代码不需要编译 , 因此速度更快 。但是Emit插入的实际上是汇编代码,不能算是脚本语言 。
本文介绍如何以CodeDom方式来动态生成可执行代码 。
如何在.NET中实现脚本引擎 (CodeDom篇)沐枫网志
1.构造一个编译器
设置编译参数
编译参数需要在CompilerParameters设置vb.netjs脚本:
CompilerOptions用于设置编译器命令行参数
IncludeDebugInformation用于指示是否在内存在生成Assembly
GenerateInMemory用于指示是否在内存在生成Assembly
GenerateExecutable用于指示生成的Assembly类型是exe还是dll
OutputAssembly用于指示生成的程序文件名(仅在GenerateInMemory为false的情况)
ReferencedAssemblies用于添加引用Assembly
例如:
theParameters.ReferencedAssemblies.Add("System.dll");
创建指定语言的编译器
编译需要由指定语言的CodeDomProvider生成 。
这里列举一些.NET的CodeDomProvider:
vb.netMicrosoft.VisualBasic.VBCodeProvider
C#Microsoft.CSharp.CSharpCodeProvider
jscriptMicrosoft.JScript.JScriptCodeProvider
J#Microsoft.VJSharp.VJSharpCodeProvider
以C#为例,要创建C#编译器,代码如下:
//.NET 1.1/1.0
ICodeCompiler compiler = new Microsoft.CSharp.CSharpCodeProvider().CreateCompiler();
//.NET 2.0
ICodeCompiler compiler = (ICodeCompiler) new Microsoft.CSharp.CSharpCodeProvider();
下面是完整的创建编译器的例子:
/// summary
/// 创建相应脚本语言的编译器
/// /summary
private void createCompiler(string strLanguage, bool debugMode, string strAssemblyFileName)
{
this.theParameters = new CompilerParameters();
this.theParameters.OutputAssembly = System.IO.Path.Combine(System.IO.Path.GetTempPath(), strAssemblyFileName".dll");
this.theParameters.GenerateExecutable = false;
this.theParameters.GenerateInMemory = true;
if(debugMode)
{
this.theParameters.IncludeDebugInformation = true;
this.theParameters.CompilerOptions= "/define:TRACE=1 /define:DEBUG=1 ";
}
else
{
this.theParameters.IncludeDebugInformation = false;
【vb.netjs脚本 vbs脚本代码大全】this.theParameters.CompilerOptions= "/define:TRACE=1 ";
}
AddReference("System.dll");
AddReference("System.Data.dll");
AddReference("System.Xml.dll");
strLanguage = strLanguage.ToLower();
CodeDomProvider theProvider;
if("visualbasic" == strLanguage || "vb" == strLanguage)
{
theProvider = new Microsoft.VisualBasic.VBCodeProvider();
if(debugMode)
theParameters.CompilerOptions= "/debug:full /optimize- /optionexplicit/optionstrict/optioncompare:text /imports:Microsoft.VisualBasic,System,System.Collections,System.Diagnostics ";
else
theParameters.CompilerOptions= "/optimize /optionexplicit/optionstrict/optioncompare:text /imports:Microsoft.VisualBasic,System,System.Collections,System.Diagnostics ";
AddReference("Microsoft.VisualBasic.dll");
}
else if("jscript" == strLanguage || "js" == strLanguage)
{
theProvider = new Microsoft.JScript.JScriptCodeProvider();
AddReference("Microsoft.JScript.dll");
}
else if("csharp" == strLanguage || "cs" == strLanguage || "c#" == strLanguage)
{
theProvider = new Microsoft.CSharp.CSharpCodeProvider();
if(!debugMode)
theParameters.CompilerOptions= "/optimize ";
}
//else if("jsharp" == strLanguage || "vj" == strLanguage || "j#" == strLanguage)
//{
//theProvider = new Microsoft.VJSharp.VJSharpCodeProvider();
//if(!debugMode)
//theParameters.CompilerOptions= "/optimize ";
//}
else
throw new System.Exception("指定的脚本语言不被支持 。");
this.theCompiler = theProvider.CreateCompiler();
}
/// summary
/// 添加引用对象 。
/// /summary
/// param name="__strAssemblyName"引用的文件名/param
public void AddReference(string __strAssemblyName)
{
theParameters.ReferencedAssemblies.Add(__strAssemblyName);
}
注:
在.NET Framework 2.0中,由于CreateCompiler方法被标记作废 。为避免产生编译警告,可直接返回CodeDomProvider作为编译器:
this.theCompiler = (ICodeCompiler)theProvider;
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;
}
}
总结:
CodeDom可以很方便的随时编译源代码 , 并动态执行 。虽然作为脚本引擎,它没有VsaEngine正规和方便 , 但作为一般应用,也够用了 。并且结合Reflection机制 , 它的功能比VsaEngine更强大:它可以编译任何提供CompilerProvider的CLR语言(目前.NET自带的语言中都有) 。
当然,它也有一些缺点:它生成的Assembly不能动态卸载 。这在一般情况下不成问题 , 因为一个源代码只需编译一次,并载入执行,并不需要动态卸载 。
假如vb.netjs脚本你需要做脚本编辑器时 , 就要考虑这个问题,因为有可能一个脚本会因为修修改改而不停的重新编译 , 从而造成不停的产生新的Assembly,最后将导致内存被大量占用 。要解决这个问题 , 需要将编译器加载到独立的AppDomain中,通过卸载AppDomain达到卸载所需的Assembly的目的 。
vb.net如何找到一个网页中的按钮的句柄网页中的按钮没有句柄可言 , 只有控件id,你想要的到底是什么,找到按钮模拟点击按钮?
找到按钮不难,查找input,id是那个按钮的话就用DOM获取到 , 然后发送.click方法
也可以用附加js脚本的方式来实现点击那个按钮,js脚本里实现获取那个按钮并点击
unity3D可以用VB.NET来写游戏脚本吗?u3d支持c#和js两种脚本,而且c#是最普遍的,咱们看unity用的编译器 , 是c#的跨平台开源编译器mono,而且是unity更改过得mono,这个编译器是基于c#.net2.0的语法的,但是由于unity的更改,使得它也支持了一些.net3.5的语法,比如匿名函数lambda表.
vb.netjs脚本的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于vbs脚本代码大全、vb.netjs脚本的信息别忘了在本站进行查找喔 。

    推荐阅读