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.
}
我在我的 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 的任何静态成员之前,不会调用此构造函数,这就是为什么这可能不是最佳方法的原因。 但是,当然,您可以在实例构造函数中处理任何基于实例的启动。