Я просмотрел все ресурсы в сети и не смог найти ответа!
Я хочу знать, возможно ли переопределить или перекомпилировать функцию в родительском приложении с помощью динамической компиляции, используя 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» в качестве вывода.