NET Framework支持动态执行C#代码

时间:2018-10-03 08:49:49

标签: c#

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#代码(并让他们提供使用的代码),然后执行它(总是希望它返回一个字符串)。

2 个答案:

答案 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();