Can Mono.Cecil modify code already loaded in the AppDomain?

巧了我就是萌 提交于 2019-11-30 16:54:13

问题


I want to add some behavior to a certain class at runtime. I know how to subclass at runtime using Reflection.Emit but thats not enough, Depending on some external configuration I need to inject opcodes in a method on a type T so all classes that inherit from it automatically gain this behavior.(I cant use the .NET Profiling API)

Can something like this be done with Mono.Cecil?

If it isnt possible to modify code on a loaded assembly, It is fine If I can make the modifications before the assembly is loaded and then load the modified assembly in memory, but I dont know how I can control assembly loading.


回答1:


Nope, Cecil can not modify a loaded assembly. You have to instrument assemblies before they are actually loaded.

You don't have much control over how assemblies are resolved. You can hook into AppDomain.AssemblyResolve if you hide the assemblies in a private folder of yours, and instrument then before loading them.




回答2:


As JB Says above- You can create a Resolve Event handler - which would be like PSeudoHooking. And before the assembly is loaded, you make your changes, and then once the changes are done, the Resolve Assembly then continues on to load the changed assembly.

I use this method for resolving Embedded Dll's from Memory Streams.



来源:https://stackoverflow.com/questions/2754821/can-mono-cecil-modify-code-already-loaded-in-the-appdomain

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!