我已经查看了网络中的所有资源,但找不到任何答案!
我想知道是否有可能通过使用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”作为输出。