CSharpCodeProvider通过动态编译覆盖,重新编译或替换现有功能

时间:2019-01-24 07:55:43

标签: c# csharpcodeprovider dynamic-compilation

我已经查看了网络中的所有资源,但找不到任何答案!

我想知道是否有可能通过使用C#CSharpCodeProvider通过动态编译覆盖或重新编译父应用程序中的函数。

我提供了一个简单的伪代码,如下所示。

Test类是我要覆盖或重新编译的类。

class Test 
{
    public virtual void Testing1()
    {
        Console.WriteLine("Method1");
    }
}

我实际上想做的是动态编译“源”并覆盖Test.Testing1。我认为我的想法有很多问题,请指导我。

source= @"
    class Test
{
    public override void Testing1()
    {
        Console.WriteLine(""Method2"");
    }
}
"

     Dictionary<string, string> providerOptions = new Dictionary<string, string>
            {
                {"CompilerVersion", "v4.0"}
            };
        CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
        CompilerParameters compilerParams = new CompilerParameters
        {
            GenerateInMemory = true,
            GenerateExecutable = false,
        };
        var assemblies = typeof(Program).Assembly.GetReferencedAssemblies();
        var assemblyLocations = assemblies.Select(a => Assembly.ReflectionOnlyLoad(a.FullName).Location).ToList();
        assemblyLocations.Add(typeof(Program).Assembly.Location);
        compilerParams.ReferencedAssemblies.AddRange(assemblyLocations.ToArray());
        CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);

结论是,如果我在动态编译之前执行以下代码,输出将是“方法1”。

Test test = new Test();
test.Testing1();

如果在编译后执行相同的代码,我想获得“方法2”作为输出。

0 个答案:

没有答案