【问题标题】:How to execute assembly code when application starts应用程序启动时如何执行汇编代码
【发布时间】:2010-03-11 09:24:11
【问题描述】:

我知道这个问题与之前的几个问题相似,但我找不到确切的答案。我有一个应用程序框架,除其他外,它可以处理未处理的错误。目前我要求宿主应用程序在应用程序的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...
}

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

【问题讨论】:

    标签: c# assemblies load initialization


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 但这需要主机应用程序在启动时执行一些特殊操作 - 还是我错过了你的意思?
      • 是的,宿主应用程序必须执行初始化,但此代码只应编写一次,无需对其进行任何更改。编写一次初始化代码后,只需添加对程序集的引用即可使其工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      相关资源
      最近更新 更多