CSharpCodeProvider переопределить, перекомпилировать или заменить существующую функцию динамической компиляцией - PullRequest
0 голосов
/ 24 января 2019

Я просмотрел все ресурсы в сети и не смог найти ответа!

Я хочу знать, возможно ли переопределить или перекомпилировать функцию в родительском приложении с помощью динамической компиляции, используя C # CSharpCodeProvider,

Я предоставил простой псевдокод, как показано ниже.

Тестовый класс - это то, что я хочу переопределить или перекомпилировать.

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» в качестве вывода.

...