日期:2014-05-18  浏览次数:20705 次

你是C#、面向对象高手吗?这问题能解决吗?
一个变态的问题
请问能否把C#代码放在数据库里,比如一个class,在程序运行时来编译这个类,然后调用其方法.


------解决方案--------------------
序列化 反序列化
------解决方案--------------------
反射调用
------解决方案--------------------
参考如下代码,将vSource复制为数据库中的类代码,再修改调用的方法名

C# code
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;

private void button1_Click(object sender, EventArgs e)
{
    ICodeCompiler vCodeCompiler = new CSharpCodeProvider().CreateCompiler();
    CompilerParameters vCompilerParameters = new CompilerParameters();
    vCompilerParameters.GenerateExecutable = false;
    vCompilerParameters.GenerateInMemory = true;
    string vSource = 
        "public class Temp\n" +
        "{\n" +
        "   public double Test(double A, double B)\n" +
        "   {\n" +
        "       return A / B;\n" +
        "   }\n" +
        "}\n";
    CompilerResults vCompilerResults =
        vCodeCompiler.CompileAssemblyFromSource(vCompilerParameters, vSource); 
    Assembly vAssembly = vCompilerResults.CompiledAssembly;
    object vTemp = vAssembly.CreateInstance("Temp");
    MethodInfo vTest = vTemp.GetType().GetMethod("Test");
    for (int i = 1; i < 100; i++)
    {
        object[] vParams = { 1, i };
        object vDouble = vTest.Invoke(vTemp, vParams);
        textBox1.AppendText(vDouble.ToString() + "\r\n");
    }
}