应用程序启动时如何执行汇编代码

时间:2010-03-11 09:24:12

标签: c# assemblies load initialization

我知道这个问题类似于以前的问题,但我找不到确切的答案。我有一个应用程序框架,除其他外,处理未处理的错误。目前,我要求主机应用程序在应用程序的Register方法中调用Main方法来注册处理程序和各种子系统。我真的想摆脱这种依赖,并用一些程序集级属性替换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...
}

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

2 个答案:

答案 0 :(得分:4)

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

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

提供了在编译之后将IL直接注入程序集所需的工具(这对我有用,因为我没有对我的代码进行签名或模糊处理)。我希望能帮助别人。

答案 1 :(得分:0)

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

我不确定是否有办法(我认为是)一次加载所有应用程序的程序集。如果您能找到这样的方式,那么您可以使用suctom属性标记需要初始化的所有程序集,然后只需浏览所有已加载的程序集(AppDomain.CurrentDomain.GetAssemblies())以过滤具有您属性的程序集。