string dyncode = "return param1 + \" \" + param2;";
CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
string src = @"
using System;
using System.Text;
using System.Text.RegularExpressions;
public class CustomTextFunction {
public string f(param1, param2) {
" + dyncode + @"
}
}
";
CompilerResults compiled = provider.CompileAssemblyFromSource(new CompilerParameters(), src);
if (compiled.Errors.Count == 0) {
Type type = compiled.CompiledAssembly.GetType("CustomTextFunction");
MessageBox.Show((string)type.GetMethod("f").Invoke(Activator.CreateInstance(type), new string[] { "Hello", "World" }));
} else {
foreach (object error in compiled.Errors) {
MessageBox.Show(error.ToString());
}
}
上面的代码基本上只返回用空格分隔的param1和param2。 param1和param2分别是“ Hello”“ World”。
问题在于System.Text.RegularExpressions作为.NET Framework的一部分不存在。 (是的,我知道它没有被使用)是否有一种方法可以用这种方法支持.Net Framework?
我基本上是在寻找一种方法,让用户手动输入C#代码(并让他们提供使用的代码),然后执行它(总是希望它返回一个字符串)。
答案 0 :(得分:1)
正如您在评论中所说,您需要添加System.Text.RegularExpressions
作为对CodeDomProvider
的引用。
您可以通过以下代码来实现;
provider.ReferencedAssemblies.Add("dll path");
在这种情况下,还有另一种解决方案。如果仅在一台计算机上运行该应用程序,则可以将所需的库添加到GAC(全局应用程序缓存)中。如果您想采用这种方法,可以点击this链接
答案 1 :(得分:1)
您需要添加对System.dll的引用
System.Text.RegularExpressions是一个名称空间,而不是程序集。
您的C#代码段包含错误,应该有参数类型。
var dyncode = "return param1 + \" \" + param2;";
CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
string src = @"
using System;
using System.Text;
using System.Text.RegularExpressions;
public class CustomTextFunction {
public string f(string param1, string param2) {
" + dyncode + @"
}
}
";
var parameters = new CompilerParameters();
parameters.ReferencedAssemblies.Add("System.dll");
CompilerResults compiled = provider.CompileAssemblyFromSource(parameters, src);
if (compiled.Errors.Count == 0)
{
Type type = compiled.CompiledAssembly.GetType("CustomTextFunction");
Console.WriteLine((string)type.GetMethod("f").Invoke(Activator.CreateInstance(type), new string[] { "Hello", "World" }));
}
else
{
foreach (object error in compiled.Errors)
{
Console.WriteLine(error.ToString());
}
}
Console.ReadKey();