C# 以字符串的形式编译代码

C# 以字符串的形式编译代码,c#,asp.net,compiler-construction,C#,Asp.net,Compiler Construction,场景: 我的函数名和参数存储在数据库中。函数名和参数从数据库返回为 "FunctionName(Convert.ToString("harry"),Convert.ToString("Password"),Convert.ToInt32("5"),Convert.ToString(""),Convert.ToString("AMER_02772"),Convert.ToInt32("0"))" 问题: 现在我想执行作为字符串返回给我的函数?请告诉我如何执行这个字符串 我读过类似的文章,但找不到

场景:

我的函数名和参数存储在数据库中。函数名和参数从数据库返回为

"FunctionName(Convert.ToString("harry"),Convert.ToString("Password"),Convert.ToInt32("5"),Convert.ToString(""),Convert.ToString("AMER_02772"),Convert.ToInt32("0"))"
问题:

现在我想执行作为字符串返回给我的函数?请告诉我如何执行这个字符串


我读过类似的文章,但找不到确切的结果。

你可以使用
GetMethod
,这是示例代码

using System;
using System.Reflection;

static class Methods
 {
public static void Inform(string parameter)
{
Console.WriteLine("Inform:parameter={0}", parameter);
}
 }

class Program
{
    static void Main()
    {
    // Name of the method we want to call.
    string name = "Inform";

    // Call it with each of these parameters.
    string[] parameters = { "Sam", "Perls" };

    // Get MethodInfo.
    Type type = typeof(Methods);
    MethodInfo info = type.GetMethod(name);

    // Loop over parameters.
    foreach (string parameter in parameters)
    {
        info.Invoke(null, new object[] { parameter });
    }
    }
}

Output

Inform:parameter=Sam
Inform:parameter=Perls

你可以参考
还有
CodeProject
链接

看一下

例如:

var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
        var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" });
        parameters.GenerateExecutable = false;
        CompilerResults results = csc.CompileAssemblyFromSource(parameters,
        @"using System.Linq;
            class MyClass {
              public void MyFunction() {
                var q = from i in Enumerable.Range(1,100)
                          where i % 2 == 0
                          select i;
              }
            }");
        results.Errors.Cast<CompilerError>().ToList().ForEach(error => Console.WriteLine(error.ErrorText));
var csc=new CSharpCodeProvider(new Dictionary(){{“compilervision”,“v3.5”});
var参数=新编译器参数(新[]{“mscorlib.dll”、“System.Core.dll”});
parameters.GenerateExecutable=false;
CompilerResults results=csc.compileasemblyFromSource(参数,
@“使用System.Linq;
类MyClass{
公共函数(){
var q=可枚举范围(1100)中的i
其中,i%2==0
选择i;
}
}");
results.Errors.Cast().ToList().ForEach(error=>Console.WriteLine(error.ErrorText));

您可以使用
CodeDomProvider
编译C代码。然后使用反射来获取类型信息,创建一个对象并调用它的一个方法

有关示例,请参见

这就是它的基本工作原理:

    string source = ...
    string references = ...

    // Compile
    CodeDomProvider provider = new CSharpCodeProvider();
    CompilerParameters cp = new CompilerParameters(references);
    cp.GenerateExecutable = false;
    cp.GenerateInMemory = true;
    CompilerResults res = provider.CompileAssemblyFromSource(cp, source);

    // Extract object
    Type t = res.CompiledAssembly.GetType(className);
    MethodInfo method = t.GetMethod(methodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);          // Get method

    // Run
    object instance =  Activator.CreateInstance(t, this);
    object ret = method.Invoke(instance, null); 

看一看反射,这实际上相当复杂。它将主要涉及创建动态装配;e、 例如,字符串中的代码必须在运行时编译。需要System.CodeDom命名空间。看看这个问题: