微软发布.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即可。