Can Mono.Cecil modify code already loaded in the AppDomain?
我想在运行时向某个类添加一些行为。 我知道如何在运行时使用Reflection.Emit进行子类化,但这还不够,根据一些外部配置,我需要在类型T上的方法中注入操作码,以便从中继承的所有类自动获得此行为。(我无法使用 .NET分析API)
可以用Mono.Cecil完成这样的事吗?
如果不能修改加载的程序集上的代码,那很好。如果我可以在加载程序集之前进行修改然后将修改后的程序集加载到内存中,但我不知道如何控制程序集加载。
不,Cecil无法修改加载的程序集。 您必须在实际加载之前对组件进行检测。
您无法控制程序集的解析方式。 如果您将程序集隐藏在您的私人文件夹中,则可以挂钩到AppDomain.AssemblyResolve,然后在加载它们之前进行监视。
正如JB所述 -
您可以创建一个Resolve Event处理程序 - 就像PSeudoHooking一样。
在加载程序集之前,进行更改,然后在完成更改后,Resolve Assembly继续加载已更改的程序集。
我使用这种方法从Memory Streams中解析嵌入式Dll。