C# 类库 如何添加启动代码

本文关键字:添加 启动 代码 类库 何添加 | 更新日期: 2023-09-27 18:34:33

下面介绍如何编写C++功能以在服务器上首次调用DLL时执行某些操作。如何在 C# 类库中执行此操作?在 Visual Studio 中,类库项目的"启动"属性灰显(禁用(,但需要库,因为我在 Web 应用程序中使用它作为参考。并且不确定如何在 C# 中编写等效项,以便我可以在加载或启动 dll 时执行一些代码来记录事件。

BOOL WINAPI DllMain(
  HINSTANCE hinstDLL, // handle to DLL module
   DWORD fdwReason, // reason for calling function
   LPVOID lpReserved ) // reserved
{
   // Perform actions based on the reason for calling.
   switch( fdwReason )
   {
     case DLL_PROCESS_ATTACH:
        // Initialize once for each new process.
        // Here is where the module POST should be invoked
        // Return FALSE to fail DLL load in case POST fails
     break;
     case DLL_THREAD_ATTACH:
        // Do thread-specific initialization.
     break;
     case DLL_THREAD_DETACH:
     // Do thread-specific cleanup.
     break;
     case DLL_PROCESS_DETACH:
     // Perform any necessary cleanup.
     break;
     }
     return TRUE; // Successful DLL_PROCESS_ATTACH.
}

C# 类库 如何添加启动代码

我在我的 Web 应用程序中使用它作为参考

如果它托管在 IIS 中,则可以使用 PreApplicationStartMethodAttribute 在应用程序启动的早期运行代码。

这允许您执行一次性初始化,但可能会强制初始化早于必要的时间,因为 IIS 将在应用程序启动时运行代码,而不是在程序集中首次使用类时运行代码。

如何在 C# 中编写等效项,以便我可以执行一些代码来记录加载或启动 dll 时的事件。

DllMain有一些非常严格的限制。无论如何,您都不能指望能够可靠地从DllMain记录事件,因此没有"我可以在C++中这样做,现在如何在 C# 中执行此操作"的先例。

C# 中没有这样的结构。 C# 是一种面向对象的语言,因此所有*可执行代码都驻留在类中。 CLR 支持此类初始化,但在 C# 或 VB.NET 中不可用。

ASP.NET 确实支持可添加到程序集以在启动时执行代码的属性,但它特定于 ASP.NET;例如,当您将程序集加载到 WPF 应用中时,它不会执行。

但是,这也意味着您不需要 C# 中的库初始化代码。 如果有需要在程序集中的类之前运行的代码,请使用这些类的静态或实例构造函数进行适当的初始化。

如果您有不适合在

构造函数中运行的昂贵代码,我的下一个选择是记录在案的Init方法,您可以在其中允许用户选择何时运行初始化代码。 如果用户选择在启动时不运行它(或不知道,则在需要初始化时运行它(构造函数、成员访问等(

*我希望这是一些深奥的例外,但没有一个是我能想到的

我不确定这是否是最好的方法,但您可以使用静态构造函数,例如:

public static class Class1
{
    static Class1()
    {
       //this constructor will be called the first time this class is used.
    }
}

请注意,在第一次使用 DLL 的任何静态成员之前,不会调用此构造函数,这就是为什么这可能不是最佳方法的原因。 但是,当然,您可以在实例构造函数中处理任何基于实例的启动。