相关疑难解决方法(0)

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

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

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

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

.net c# reflection clr .net-assembly

20
推荐指数
1
解决办法
1393
查看次数

DisallowApplicationBaseProbing = true时需要连接AssemblyResolve事件

设置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,因此不知道在哪里可以找到该程序集。看来我有鸡肉和鸡蛋问题。它需要解析我的程序集以连接程序集解析器,但需要程序集解析器来解析我的程序集。

感谢您提供的所有帮助。

-麦克风

c# assembly-resolution

4
推荐指数
1
解决办法
1998
查看次数

标签 统计

c# ×2

.net ×1

.net-assembly ×1

assembly-resolution ×1

clr ×1

reflection ×1