假设我有一个AppDomain.AssemblyResolve事件处理程序,在处理程序中我构造一个字节数组并调用该方法Assembly.Load(byte[]).此方法本身是否会AssemblyResolve再次引发事件,并导致我的处理程序重新进入?
我的问题不仅限于可以使用C#编译器生成的程序集,它们可以包含CLR支持的abritrary元数据和可执行代码.
我做了一些实验,发现时没有发现任何情况.我试图加载需要额外引用的程序集,尝试将CAS属性添加到加载的程序集,其解码需要另一个程序集,尝试使用模块初始化程序(全局.cctor方法)加载程序集.在任何情况下,我都没有观察到AssemblyResolve要从Assembly.Load(byte[])方法内部引发的事件,只有在某些代码稍后尝试访问加载的程序集中的类型,方法或属性时才会发生.但我可以在这里遗漏一些东西.
设置DisallowApplicationBaseProbing = true时,我需要在创建的AppDomain上连接AssemblyResolve事件。我这样做的原因是强制运行时调用需要解析程序集的AssemblyResolve事件,而不是先进行探测。这样,另一个开发人员就不能仅将MyDllName.dll粘贴在ApplicationBase目录中,并覆盖我想在AssemblyResolve事件中加载的程序集。
这样做的问题如下:
class Program
{
static void Main()
{
AppDomainSetup ads = new AppDomainSetup();
ads.DisallowApplicationBaseProbing = true;
AppDomain appDomain = AppDomain.CreateDomain("SomeDomain", null, ads);
appDomain.AssemblyResolve += OnAssemblyResolve;
appDomain.DoCallBack(target);
}
static System.Reflection.Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
Console.WriteLine("Hello");
return null;
}
private static void target()
{
Console.WriteLine(AppDomain.CurrentDomain);
}
}
Run Code Online (Sandbox Code Playgroud)
代码永远不会超出+ = OnAssemblyResolve行。
当代码尝试执行时,新的应用程序域将尝试解析我正在其中执行的程序集。由于DisallowApplicationBaseProbing = true,因此不知道在哪里可以找到该程序集。看来我有鸡肉和鸡蛋问题。它需要解析我的程序集以连接程序集解析器,但需要程序集解析器来解析我的程序集。
感谢您提供的所有帮助。
-麦克风