【问题标题】:Is there an equivalent of Application_Start for a class library in c#c# 中的类库是否有等效于 Application_Start
【发布时间】:2011-10-04 23:37:36
【问题描述】:

当从另一个程序集实例化类库时,我想在类库中执行某些代码。类库是否有入口点或引导程序? 我认为静态方法 Main 可以解决问题,但我错了。

这方面的应用程序可能正在配置和实例化记录器单例、未处理的异常处理程序等。

【问题讨论】:

  • 您正在寻找 C# 不支持的模块初始化程序。
  • 您能否提供进入类库的单点入口,例如您必须调用的静态类工厂才能从库中获取任何有用的实例?然后你可以在第一次调用静态类工厂时进行初始化。
  • 您不能只使用某个您知道将从该程序集中加载的类的静态构造函数吗?
  • 主要方法

标签: c# .net class-library


【解决方案1】:

图书馆没有起点。当您实例化一个库的类时,您调用的第一条指令是类的构造函数(new)及其基构造函数(如果它们在构造函数定义中)。

【讨论】:

    【解决方案2】:

    AppDomain.AssemblyLoad Event 在加载程序集时发生。可能可以用来调用类库中的初始化方法。

    public static void Main() 
    {
        AppDomain currentDomain = AppDomain.CurrentDomain;
        currentDomain.AssemblyLoad += new AssemblyLoadEventHandler(MyAssemblyLoadEventHandler);
    }
    
    static void MyAssemblyLoadEventHandler(object sender, AssemblyLoadEventArgs args) 
    {
          Console.WriteLine("ASSEMBLY LOADED: " + args.LoadedAssembly.FullName);
          //If this is the assembly that you want to call an initialize method..
    }
    

    下面是两个相似的话题

    how to write class lib's assembly load/init event handler

    .Net: Running code when assembly is loaded

    【讨论】:

    • 你确定这会起作用吗?我假设您将在静态构造函数中订阅它。如果是这种情况,我认为该事件将在静态构造函数运行之前触发。
    • 不太确定他们会按什么顺序开火。但是,这可以用来在应用程序中设置标志或调用类库中的初始化方法。
    【解决方案3】:

    最好和安全的方法是设计您的库,以便调用者知道可以初始化您的库。

    加载程序集时,CLR 使用大量机器来完成工作,从内部平台如何设计将模块加载到 CLR 本身。每个参与的参与者都有自己的局限性。

    在加载模块时执行代码不是 Win32 上的最佳实践,原因相同:您无法知道调用者在做什么;此外,您所做的更改可能会改变当前的 AppDomain,但可能不会在应用程序的所有其他 AppDomain 中传播。

    有意识的初始化方法是让调用者控制程序集初始化的最简洁的方法。

    所有其他答案部分解决了该问题,但可能会引入不需要的副作用和不确定的行为。

    【讨论】:

      【解决方案4】:

      你查看过PreApplicationStartMethodAttribute吗?

      using System.Web;
      
      [assembly: PreApplicationStartMethod(typeof(ClassLibrary.Startup), "Start")]
      
      namespace ClassLibrary
      {
          public class Startup
          {
              public static void Start()
              {
                  // do some awesome stuff here!
              }
          }
      }
      

      更多详情:http://dochoffiday.com/professional/simulate-application-start-in-class-library

      【讨论】:

      • 这仅在 asp.net 应用程序中有效,例如在类库测试项目的上下文中无效。文档中没有关于它的内容,但是在我尝试了这一点并探索了支持在 WebActivator documentation 的 ASP.NET 部分之外调用启动方法的支持之后,这一点变得很明显,PreApplicationStartMethodAttribute 内部使用了PreApplicationStartMethodAttribute
      • 投了反对票,因为问题与 ASP.NET 无关。
      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      相关资源
      最近更新 更多