Vla*_*kov 20 .net c# reflection clr .net-assembly
假设我有一个AppDomain.AssemblyResolve事件处理程序,在处理程序中我构造一个字节数组并调用该方法Assembly.Load(byte[]).此方法本身是否会AssemblyResolve再次引发事件,并导致我的处理程序重新进入?
我的问题不仅限于可以使用C#编译器生成的程序集,它们可以包含CLR支持的abritrary元数据和可执行代码.
我做了一些实验,发现时没有发现任何情况.我试图加载需要额外引用的程序集,尝试将CAS属性添加到加载的程序集,其解码需要另一个程序集,尝试使用模块初始化程序(全局.cctor方法)加载程序集.在任何情况下,我都没有观察到AssemblyResolve要从Assembly.Load(byte[])方法内部引发的事件,只有在某些代码稍后尝试访问加载的程序集中的类型,方法或属性时才会发生.但我可以在这里遗漏一些东西.
据我所知Assembly.Load或通过其他方式加载程序集不会执行 C# 编译器可以生成的任何构造函数(包括静态构造函数)。结果你将无法重入AssemblyResolve常见的程序集。
正如您在问题中提到的,模块初始值设定项在Load调用期间不会执行。CLI 规范中的保证列表中涵盖了 - 摘录可以在模块初始化程序中找到CLI 规范中的保证列表中涵盖了 - 摘录可以在Junfeng Zhang 的
\n\nB. module\xe2\x80\x99s 初始化方法在第一次访问模块中定义的任何类型、方法或数据时或之前执行
\n
有相关的 SO 问题通常讨论“在任何类型构造函数之前运行代码”,例如在程序集加载时初始化库。请注意.Net:加载程序集时运行代码有 Marc Gravell 的答案,指出由于安全限制,这可能是不可能的。
\n