【问题标题】:AppDomain event that gets called for *ATTEMPTED* assembly resolution为 *ATTEMPTED* 程序集解析而调用的 AppDomain 事件
【发布时间】:2011-07-10 14:22:49
【问题描述】:

是否有一个我们可以挂钩的事件,它被调用一个程序集被解决。

例如,如果 AppDomain 中的某些代码正在调用 Assembly.Load(path) ,则会引发该事件,表示尝试加载此程序集?

这对于重定向在某些组件中硬编码的可能的程序集负载很有用。

如果可能,也可以从配置中执行此操作。

有什么建议吗?

【问题讨论】:

    标签: c# .net-assembly assembly-loading


    【解决方案1】:

    不,没有这样的事件。一种可能的技巧是故意错误配置 AppDomainSetup.ApplicationBase 属性,以便 CLR 永远找不到任何程序集。在这种情况下,AppDomain.AssemblyResolve 事件将被触发,允许您实现自己的程序集解析方案。

    【讨论】:

      【解决方案2】:

      从文档看来,在此过程开始时没有引发任何事件。因此,我建议(如果可能),您编写如下内容并始终使用它:

      public static class AssemblyLoader
      {
          public delegate void LoadDelegate(string path);
      
          public void LoadAssembly(string path)
          {
              if(OnPreLoad != null)
                  OnPreLoad(path);
              // load assembly here
          }  // eo LoadAssembly
      
          public event LoadDelegate OnPreLoad;
      } // eo AssemblyLoader
      

      然后,当您想要加载程序集时,您可以在代码中的任何位置使用此方法。

      显然,您可能希望在该委托中使用适当的对象(而不仅仅是路径)以防止加载程序集或执行不同的操作。

      【讨论】:

      • 我遇到的问题是程序集加载代码不是由我(第 3 方)编写的。此代码使用硬编码位置来解析插件。我想拦截此过程并能够提供我自己的位置,因为它会导致分发使用此第 3 方的应用程序时出现问题。
      • @liortal,啊,我想知道 - 如果您无法控制加载程序集的过程,这种方法实际上将不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 2021-05-11
      相关资源
      最近更新 更多