可以调用Assembly.Load(byte [])来引发AppDomain.AssemblyResolve事件吗?

Vla*_*kov 20 .net c# reflection clr .net-assembly

假设我有一个AppDomain.AssemblyResolve事件处理程序,在处理程序中我构造一个字节数组并调用该方法Assembly.Load(byte[]).此方法本身是否会AssemblyResolve再次引发事件,并导致我的处理程序重新进入?

我的问题不仅限于可以使用C#编译器生成的程序集,它们可以包含CLR支持的abritrary元数据和可执行代码.

我做了一些实验,发现时没有发现任何情况.我试图加载需要额外引用的程序集,尝试将CAS属性添加到加载的程序集,其解码需要另一个程序集,尝试使用模块初始化程序(全局.cctor方法)加载程序集.在任何情况下,我都没有观察到AssemblyResolve要从Assembly.Load(byte[])方法内部引发的事件,只有在某些代码稍后尝试访问加载的程序集中的类型,方法或属性时才会发生.但我可以在这里遗漏一些东西.

Ale*_*kov 1

据我所知Assembly.Load或通过其他方式加载程序集不会执行 C# 编译器可以生成的任何构造函数(包括静态构造函数)。结果你将无法重入AssemblyResolve常见的程序集。

\n

正如您在问题中提到的,模块初始值设定项在Load调用期间不会执行。CLI 规范中的保证列表中涵盖了 - 摘录可以在模块初始化程序中找到CLI 规范中的保证列表中涵盖了 - 摘录可以在Junfeng Zhang 的

\n
\n

B. module\xe2\x80\x99s 初始化方法在第一次访问模块中定义的任何类型、方法或数据时或之前执行

\n
\n

有相关的 SO 问题通常讨论“在任何类型构造函数之前运行代码”,例如在程序集加载时初始化库。请注意.Net:加载程序集时运行代码有 Marc Gravell 的答案,指出由于安全限制,这可能是不可能的。

\n

  • 您引用的问题的答案显然没有提供任何方法使代码在调用“Assembly.Load(byte[])”期间立即执行。属性是被动数据,除非显式读取它们,并且仅在尝试访问全局声明的成员之前调用模块初始值设定项(我在问题中提到过)。也许有一些特殊属性会在程序集加载时由 CLR 自动读取,然后我可以为此类属性提供枚举参数,其中枚举类型在引用的程序集中声明... (2认同)