Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在第一次调用.NET dll时运行方法?_C#_Dll - Fatal编程技术网

C# 如何在第一次调用.NET dll时运行方法?

C# 如何在第一次调用.NET dll时运行方法?,c#,dll,C#,Dll,我的情景 我的DLL中的许多类利用了一些常见的服务,如日志记录。这些公共服务需要初始化。因为我不知道将首先构造哪些类,所以我在所有构造函数中都包含类似的代码 Logger.Configure(); 问题: 是否有一种方法可以在首次加载DLL时订阅事件,以便在那里初始化公共服务,从而允许我的类假定公共服务已准备好使用 我查看了,但示例演示了它在可执行文件上下文中的使用,在可执行文件上下文中,当应用程序启动时,事件在Main方法中注册 简单的做法是在需要aka静态构造函数的类中使用它,因此每个类执

我的情景 我的DLL中的许多类利用了一些常见的服务,如日志记录。这些公共服务需要初始化。因为我不知道将首先构造哪些类,所以我在所有构造函数中都包含类似的代码

Logger.Configure();
问题: 是否有一种方法可以在首次加载DLL时订阅事件,以便在那里初始化公共服务,从而允许我的类假定公共服务已准备好使用


我查看了,但示例演示了它在可执行文件上下文中的使用,在可执行文件上下文中,当应用程序启动时,事件在Main方法中注册

简单的做法是在需要aka静态构造函数的类中使用它,因此每个类执行一次。但这仍然感觉不对

但是您可以按照James的建议封装调用,然后在封装类的类构造函数中进行初始化,因此编写代码一次,然后运行初始化一次

。。。或者更复杂的事情是定义一个模块初始值设定项。这是加载程序集时运行的一段代码,这正是您要查找的。但是它并不容易访问,因为C编译器没有提供一种开箱即用的编写方法


这就是发挥作用的地方。它是一个织工。编写一个类,然后在编译之后,Fody将类转换为模块初始值设定项。您是否值得为封装技术的特殊情况而烦恼,这取决于您的决定。

看起来您可能正在使用log4net?您能给它添加一个小的包装器吗?这样,您就不用在log4net对象上调用GetLogger,而是在包装器上调用它?这样,第一次调用它时,它可以调用.Configure,然后调用原始的GetLoggerYes,我正在使用log4net,并且我已经在做您建议的事情了-在我的示例中,Logger是一个包装器,它确保log4net只配置一次。但这不是我想要解决的问题。我的问题是如何删除此调用记录器。从所有依赖log4net的类中进行配置,同时确保已配置log4net?还有一个选项,如果您使用ASP.NET 4或更新版本,则可以使用该选项在IIS加载DLL时调用方法。我没有使用ASP.NET。我怀疑我将不得不求助于类似PostSharp的东西,谢谢你确认这是我要走的路线。@AlexT实际上我想鼓励你自己提供一个ILog的实现,比如内部类LogForwarder:ILog,将所有调用委托给一个真正的记录器,并使用LogForwarder的静态构造函数进行初始化。然后始终在代码中使用LogForwarder,而不是log4net提供的ILog。使用Fody肯定会起作用,但我不认为这对于这个特定任务是必要的。尽管我同意您关于实现ILog的建议,但这样做并没有解决最初的问题——如何避免在我的所有构造函数中直接调用间接配置方法。同时,福迪或类似公司确实提供了一个解决方案。