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

时间:2014-12-18 13:51:55

标签: c# c++ multithreading visual-studio startup

下面是在服务器上首次调用DLL时如何编写C ++功能来执行某些操作。如何在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.
}

3 个答案:

答案 0 :(得分:2)

  

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

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

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

  

如何在C#中编写一个等价物,这样我就可以在加载或启动dll时记录事件。

DllMain有一些非常严格的限制。你不能期望能够从DllMain可靠地记录事件,因此没有先例可以用于#34;我现在可以在C ++中这样做,我该怎么做呢C#"

答案 1 :(得分:1)

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

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

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

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

* 我希望那些一些深奥的异常,但没有我能想到的

答案 2 :(得分:0)

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

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

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