JScript 脚本化已经实现了,但是如何实现 vbs 脚本化?帮忙看看下属代码到底是 vbs 内容不对还是 c#根本不支持vbs脚本化。using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.JScript;
using System.ComponentModel;namespace ConsoleApplication1
{
/// <summary>
/// 解决在 C# 中执行脚本化操作的类。
/// 20180531 包含了eval函数。以后会继续扩展。
/// </summary>
public class EvaluatorHelper
{
public enum ScriptLanguage {
VBScript,
JScript
}
/// <summary>
/// 设定当前的脚本类型
/// </summary>
public ScriptLanguage Scripts { get; set; } private string _scriptContent; public string ScriptContent
{
get { return _scriptContent; }
set { _scriptContent = value; }
} private Type _scriptAssemblyType;
private object _scriptEvaluator; public object testc (string expression){
object result;
result = _scriptAssemblyType.InvokeMember(
"MyEval",
BindingFlags.InvokeMethod,
null,
_scriptEvaluator,
new object[] { expression }
);
return result; } public EvaluatorHelper() { } public EvaluatorHelper(ScriptLanguage language, string scriptContent) {
_scriptContent = scriptContent; CodeDomProvider provider; CompilerParameters parameters;
parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
parameters.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll");
CompilerResults results;
if (language == ScriptLanguage.JScript)
{
provider = new JScriptCodeProvider();
results = provider.CompileAssemblyFromSource(parameters, _scriptContent);
}
else if (language == ScriptLanguage.VBScript)
{
provider = CodeDomProvider.CreateProvider("VBScript");
results = provider.CompileAssemblyFromSource(parameters, _scriptContent);
}
else {
throw new ArgumentException("未设置有效的参数。");
} //永远是这行提示错误:
//{"未能加载文件或程序集“file:///C:\\Documents and Settings\\Administrator\\Local Settings\\Temp\\2tm1mkrv.dll”或它的某一个依赖项。系统找不到指定的文件。":"file:///C:\\Documents and Settings\\Administrator\\Local Settings\\Temp\\2tm1mkrv.dll"}
Assembly assembly = results.CompiledAssembly;
_scriptAssemblyType = assembly.GetType("Evaluator"); _scriptEvaluator = Activator.CreateInstance(_scriptAssemblyType);
}
}
}
调用代码:
string sc =
@"
public class Evaluator
public function MyEval(s as string) as string
MyEval = eval(s)
end function
public function xxx(byval a as string ,byval b as string) as string
xxx = a & b & a
end function
end class
"; EvaluatorHelper eh = new EvaluatorHelper(EvaluatorHelper.ScriptLanguage.VBScript, sc);
Debug.Print( eh.testc("1+2+3").ToString());
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.JScript;
using System.ComponentModel;namespace ConsoleApplication1
{
/// <summary>
/// 解决在 C# 中执行脚本化操作的类。
/// 20180531 包含了eval函数。以后会继续扩展。
/// </summary>
public class EvaluatorHelper
{
public enum ScriptLanguage {
VBScript,
JScript
}
/// <summary>
/// 设定当前的脚本类型
/// </summary>
public ScriptLanguage Scripts { get; set; } private string _scriptContent; public string ScriptContent
{
get { return _scriptContent; }
set { _scriptContent = value; }
} private Type _scriptAssemblyType;
private object _scriptEvaluator; public object testc (string expression){
object result;
result = _scriptAssemblyType.InvokeMember(
"MyEval",
BindingFlags.InvokeMethod,
null,
_scriptEvaluator,
new object[] { expression }
);
return result; } public EvaluatorHelper() { } public EvaluatorHelper(ScriptLanguage language, string scriptContent) {
_scriptContent = scriptContent; CodeDomProvider provider; CompilerParameters parameters;
parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
parameters.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll");
CompilerResults results;
if (language == ScriptLanguage.JScript)
{
provider = new JScriptCodeProvider();
results = provider.CompileAssemblyFromSource(parameters, _scriptContent);
}
else if (language == ScriptLanguage.VBScript)
{
provider = CodeDomProvider.CreateProvider("VBScript");
results = provider.CompileAssemblyFromSource(parameters, _scriptContent);
}
else {
throw new ArgumentException("未设置有效的参数。");
} //永远是这行提示错误:
//{"未能加载文件或程序集“file:///C:\\Documents and Settings\\Administrator\\Local Settings\\Temp\\2tm1mkrv.dll”或它的某一个依赖项。系统找不到指定的文件。":"file:///C:\\Documents and Settings\\Administrator\\Local Settings\\Temp\\2tm1mkrv.dll"}
Assembly assembly = results.CompiledAssembly;
_scriptAssemblyType = assembly.GetType("Evaluator"); _scriptEvaluator = Activator.CreateInstance(_scriptAssemblyType);
}
}
}
调用代码:
string sc =
@"
public class Evaluator
public function MyEval(s as string) as string
MyEval = eval(s)
end function
public function xxx(byval a as string ,byval b as string) as string
xxx = a & b & a
end function
end class
"; EvaluatorHelper eh = new EvaluatorHelper(EvaluatorHelper.ScriptLanguage.VBScript, sc);
Debug.Print( eh.testc("1+2+3").ToString());
解决方案 »
- 利用ADO.NET将SQL SERVER数据导出到ACCESS发生“无法初始化链接服务器 \"(null)\”的错误
- SqlParameter 对象的name属性值为什么要用@?
- 在MessageBox中,MessageBoxButtons如何觸發點擊OK或取消的事件啊!!
- 请大家帮忙讨论,如何实现web应用程序和windows应用程序(后台)间进行通信!参与给分
- 如何利用telnet下载远端文件到本机
- 求救,请教关闭上一层的窗口问题。
- 各位杂样 自己做一个类似与 Doc 的copy功能
- C# 操作 EXCEL 单元格问题
- 昨天发帖没解决,今天再发一次。求一算法.
- OLE DB .NET不能使用命名参数么?
- C# SqlDataAdapter 填充 DataSet 忽快忽慢的问题
- 请教这样的导航界面怎么实现
若你需要在dotNET中使用VBS的脚本,那么你可以利用微软提供的“JavaScript / VBScript”的虚拟机
MSScriptControl.ScriptControl 即可,但是它的效率会比较慢因为它完全是解释型执行的,而若你采纳
VB.NET/CodeDom则不存在这个问题,为其运行的VB脚本代码可以获得dotNET/JIT优化过后的代码
效率。
在CodeDom中你可以通过以下两类方式创建“VB”的代码生成器实例!
1、VBCodeTextGenerator
2、CodeDomProvider::CreateProvider("vb")
一般来说dotNET框架CodeDom至少携带四种语言代码的编译,你可以通过
CodeDomProvider::GetAllCompilerInfo() 函数轻松获取到这些被支持的语言列表信息。