下面是在服务器上首次调用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.
}
答案 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的任何静态成员之前,不会调用此构造函数,这就是为什么这可能不是最好的方法。但是,您当然可以在实例构造函数中处理任何基于实例的启动。