110,477
社区成员
发帖
与我相关
我的任务
分享
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());