我想在运行时向某个类添加一些行为。我知道如何在运行时使用 Reflection.Emit 进行子类化,但这还不够。根据一些外部配置,我需要在类型 T 的方法中注入操作码,以便从它继承的所有类自动获得此行为。(我不能使用 .NET Profiling API)。
可以用 Mono.Cecil 完成这样的事情吗?
如果无法在加载的程序集上修改代码,那很好,如果我可以在加载程序集之前进行修改,然后将修改后的程序集加载到内存中,但我不知道如何控制程序集加载。
我想在运行时向某个类添加一些行为。我知道如何在运行时使用 Reflection.Emit 进行子类化,但这还不够。根据一些外部配置,我需要在类型 T 的方法中注入操作码,以便从它继承的所有类自动获得此行为。(我不能使用 .NET Profiling API)。
可以用 Mono.Cecil 完成这样的事情吗?
如果无法在加载的程序集上修改代码,那很好,如果我可以在加载程序集之前进行修改,然后将修改后的程序集加载到内存中,但我不知道如何控制程序集加载。
不,Cecil 不能修改已加载的程序集。您必须在实际加载程序集之前对其进行检测。
您对如何解决程序集没有太多控制权。如果您将程序集隐藏在您的私有文件夹中,您可以连接到 AppDomain.AssemblyResolve,然后在加载它们之前进行检测。
正如上面 JB 所说 - 您可以创建一个解决事件处理程序 - 这就像 PSeudoHooking。在加载程序集之前,您进行更改,然后一旦更改完成,解析程序集就会继续加载更改的程序集。
我使用这种方法从内存流中解析嵌入式 Dll。