2010-03-11 105 views
2

我知道这个问题与之前几个类似,但是我找不到确切的答案。我有一个应用程序框架,除其他外,处理未处理的错误。目前,我要求主机应用程序在应用程序的Main方法中调用Register方法来注册处理程序和各种子系统。我真的想摆脱这种依赖性,并用一些汇编级属性替换Register方法的参数。所以,我需要的是一种检测主机应用程序是否已经从我的程序集中启动的方式 - 就像它是.NET框架的一部分一样。如何在应用程序启动时执行汇编代码

我想避免从主机应用程序或配置文件中的任何特殊行(尽管这些更可接受)的任何显式调用。因此,只需添加对程序集的引用即可在应用程序启动时初始化这些功能。有没有人制定过这种方法?

为了把事情说清楚,这是我理想的一个例子之前和场景后:

// BEFORE: 
[System.STAThread] 
private static int Main(string[] args) 
{ 
    SupportLibrary.Register(typeof(Program).Assembly, SupportLibrary.ApplicationType.WinForms); 

    // Get the application initialised... 
} 

// AFTER: 
[System.STAThread] 
[SupportLibrary.ApplicationType(SupportLibrary.ApplicationType.WinForms)] 
private static int Main(string[] args) 
{ 
    // Get the application initialised... 
} 

问题的关键是,我想摆脱显式调用的注册,支持库中,而是有它们在应用程序启动并加载支持程序集时隐式注册。

回答

4

所以,我找到了答案。这可能不适用于任何情况,但它适用于我,因为我的库的使用方式意味着它始终在应用程序启动时加载。 CLR规范提供了要定义的模块初始化程序。这些被称为第一次访问模块(例如程序集)并且在任何代码执行之前 - 这正是我想要的。没有直接规定在C#中指定这些,但这篇文章:

http://tech.einaregilsson.com/2009/12/16/module-initializers-in-csharp

提供编译后必要的直接注射IL到您的装配工具(这是因为我没有签署或obsfuscating对我的作品我的代码)。我希望能帮助别人。

0

最简单的方法是使用配置文件 - 只需添加自定义部分,您将编写所有需要初始化的程序集。比您的主机应用程序将通过该列表,并在您需要的每个程序集上调用Assembly.Load()方法。之后,您可以执行任何必要的初始化(标记在具有自定义属性的程序集中调用的方法等)。

我不确定是否有办法(我认为是)一次加载所有应用程序的程序集。如果你能找到这样的方式,你可以用suctom属性标记所有需要初始化的程序集,然后通过加载的所有加载的程序集(AppDomain.CurrentDomain.GetAssemblies())来筛选具有属性的程序集。

+0

但是,这将需要主机应用程序启动时执行一些特殊的操作 - 或者我错过了你的观点? – 2010-03-11 10:37:33

+0

是的,主机应用程序将不得不执行初始化,但这个代码应该只写一次,不需要对其进行更改。在你编写了这个初始化代码之后,只有添加对程序集的引用才能使其工作。 – 2010-03-11 11:09:38

相关问题