我的程序中有一个文本框。在文本框中,您可以编写要运行的函数/方法的名称以及传递参数。如果我的案例被填充,这一切都被解析并通过一个大的开关块我为那个特定案例的代码,以及传递参数。
但是我真正想做的是使用stringbuilder构建源代码然后运行它!
这是使用我的 stringbuilder 构建的源代码示例。
outlook outlooken = new outlook(appNwindow);
和
outlooken.createNewEmail(scriptarray[i][1],scriptarray[i][2],
scriptarray[i][3],scriptarray[i][4]);
使用 stringbuilder 创建字符串完全没有问题。但是我该如何运行它们呢?
我已经进行了很多测试,并设法将所有东西都准备好,但我认为我遗漏了一些东西,因为我的代码总是会产生错误......
这是我的源代码
CodeDomProvider myCodeDomeProvider = CodeDomProvider.CreateProvider("CSharp");
String [] referenceAssemblies = {"System.dll"};
// string myAssemblyName = "myAssembly.dll";
CompilerParameters myCompilerparameters =
new CompilerParameters(referenceAssemblies);
myCompilerparameters.GenerateExecutable = false;
myCompilerparameters.GenerateInMemory = true;
//*** Here's the sourcecode it want to compile
string[] arr1 = new string[] { "outlook outlooken = new outlook(appNwindow);","outlooken.createNewEmail(scriptarray[i][1],scriptarray[i][2],scriptarray[i[3],scriptarray[i][4]);"};
CompilerResults myResults = myCodeDomeProvider.CompileAssemblyFromSource(myCompilerparameters, arr1);
string objectname = "testet";
string method = "createNewEmail";
object[] args = new object[2];
args[0] = "to";
args[1] = "CC";
if (myResults.Errors.HasErrors)
{
StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
foreach (CompilerError error in myResults.Errors)
{
errors.AppendFormat("Line {0},{1}\t: {2}\n",
error.Line, error.Column, error.ErrorText);
}
throw new Exception(errors.ToString());
}
else
{
Assembly assem = myResults.CompiledAssembly;
object instance = null;
Type type = assem.GetType(objectname);
MethodInfo miChk = type.GetMethod(method);
if (!miChk.IsStatic)
{
instance = assem.CreateInstance(objectname);
type = instance.GetType();
}
MethodInfo mi = type.GetMethod(method);
mi.Invoke(instance, args);
}
这些是我在运行它时遇到的错误:
附加信息:编译器错误:
第 1,1 行:命名空间不能直接包含字段或方法等成员
第 1,25 行:预期的类、委托、枚举、接口或结构
第 1,1 行:命名空间不能直接包含字段或方法等成员
第 1,41 行:预期标识符
第 1,59 行:预期标识符
第 1,77 行:预期标识符
第 1,95 行:需要标识符