.Net 6在Main函数前执行一些动作(原理)

微软发布.net 6有一段时间了,这里我们来看看一些比较稀有的特性。比如在main函数前执行一些动作。这篇文章之前有讲过,这里补充点原理性东西。

 

众所周知的,Main函数是程序开始的起点,但是在C#里面,CLR考虑到了,在某些应用场景里面可能会在Main函数之前也会执行一些方法或者动作。所以提供了这种功能。.

 

原理在于:CLR执行Main函数内存模型的时候,会运行RunStartupHooks();这个函数。这个函数直接调用了System.Private.CoreLib.dll程序集里面的命名空间为:

System.StartupHookProvider。方法名为:

ProcessStartupHooks的函数。

ProcessStartupHooks

函数,会查找环境变量DOTNET_STARTUP_HOOKS,

然后加载环境变量的值。把其变为程序集。通过程序集提取类型为StartupHook的类,然后执行里面的静态方法Initialize。得以完成在Main函数之前执行一些动作。

 

通过原理其实可以看到,我们只需要写一个没有命名空间的类,类名为StartupHook,里面有一个静态方法名称为:Initialize。这样就可以自动契合CLR来在Main之前执行一些动作。

 

using System;public class StartupHook{  public static void Initialize()  {  Console.WriteLine("这里是Main函数之前的一些动作!");  }}  public class Program  {  static void Main(string[] args)  {  Console.WriteLine("Hello World!");  Console.ReadLine();  }}

 

然后右键项目属性-》调试-》环境变量DOTNET_STARTUP_HOOKS=*.dll即可。