如何让 C# 支持 VBScript 脚本化?

changechange 2018-05-31 06:15:01
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());

...全文
1011 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
liulilittle 2018-06-03
  • 打赏
  • 举报
回复
CodeDom中支持VB语言的表达式树解析与编译,但是它并不支持VBScript语言而是仅仅支持VB.NET。 若你需要在dotNET中使用VBS的脚本,那么你可以利用微软提供的“JavaScript / VBScript”的虚拟机 MSScriptControl.ScriptControl 即可,但是它的效率会比较慢因为它完全是解释型执行的,而若你采纳 VB.NET/CodeDom则不存在这个问题,为其运行的VB脚本代码可以获得dotNET/JIT优化过后的代码 效率。 在CodeDom中你可以通过以下两类方式创建“VB”的代码生成器实例! 1、VBCodeTextGenerator 2、CodeDomProvider::CreateProvider("vb") 一般来说dotNET框架CodeDom至少携带四种语言代码的编译,你可以通过 CodeDomProvider::GetAllCompilerInfo() 函数轻松获取到这些被支持的语言列表信息。
changechange 2018-06-01
  • 打赏
  • 举报
回复
答非所问,有知道如何用CodeDom来做VBS运行时编译的么?
threenewbee 2018-05-31
  • 打赏
  • 举报
回复
直接调用wsh去执行vbs代码

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧