首页 > 解决方案 > CSharpCodeProvider 通过动态编译覆盖、重新编译或替换现有函数

问题描述

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

我想知道是否可以使用 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”作为输出。

标签: c#csharpcodeproviderdynamic-compilation

解决方案


推荐阅读