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

C# 应用程序启动时如何执行汇编代码,c#,assemblies,load,initialization,C#,Assemblies,Load,Initialization,我知道这个问题与前面的几个问题相似,但我找不到确切的答案。我有一个应用程序框架,其中包括处理未处理的错误。目前,我要求宿主应用程序在应用程序的Main方法中调用Register方法来注册处理程序和各种子系统。我真的想摆脱这种依赖关系,用一些程序集级属性替换Register方法的参数。因此,我需要的是一种检测主机应用程序是否已从我的程序集中启动的方法,就像它是.NET framework的一部分一样 我希望避免主机应用程序中的任何显式调用,或配置文件中的任何特殊行(尽管这些是可以接受的)。因此,只

我知道这个问题与前面的几个问题相似,但我找不到确切的答案。我有一个应用程序框架,其中包括处理未处理的错误。目前,我要求宿主应用程序在应用程序的
Main
方法中调用
Register
方法来注册处理程序和各种子系统。我真的想摆脱这种依赖关系,用一些程序集级属性替换
Register
方法的参数。因此,我需要的是一种检测主机应用程序是否已从我的程序集中启动的方法,就像它是.NET framework的一部分一样

我希望避免主机应用程序中的任何显式调用,或配置文件中的任何特殊行(尽管这些是可以接受的)。因此,只要添加对程序集的引用,就可以在应用程序启动时初始化这些特性。有人想出办法让这一切发生吗

为了让事情更清楚,下面是一个我理想的前后场景示例:

// 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...
}

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

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


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

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


提供编译后将IL直接注入程序集所需的工具(这对我很有用,因为我没有对代码进行签名或混淆)。我希望这对某些人有所帮助。

但这需要主机应用程序在启动时执行一些特殊操作-或者我没有领会您的意思吗?是的,主机应用程序必须执行初始化,但此代码只需编写一次,无需对其进行任何更改。编写一次初始化代码后,只需向程序集添加引用即可使其正常工作。