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


person Emily Wong    schedule 24.01.2019    source источник
comment
Разве ваша проблема не в том, что метод Test, который вы компилируете, не наследуется от исходного класса Test?   -  person Llama    schedule 24.01.2019
comment
позвольте мне отредактировать мой вопрос с более подробной информацией   -  person Emily Wong    schedule 24.01.2019
comment
Я имею в виду, что вы не можете переопределить метод базового класса, если производный класс фактически не является производным от этого базового класса.   -  person Llama    schedule 24.01.2019
comment
обновил вопрос, надеюсь, теперь все ясно.   -  person Emily Wong    schedule 24.01.2019
comment
Я думаю, что ближе всего вы получите то, что описано здесь, но я думаю, что это только после создания экземпляра типа. Если у вас нет доступа к коду, создающему экземпляры этого типа, то я не думаю, что вы даже можете заменить тип прокси.   -  person Llama    schedule 24.01.2019
comment
Возможно, это могло бы помочь softwareengineering.stackexchange.com/questions/93322/   -  person Vladimir P.    schedule 24.01.2019