如何实现C#程序集加载时自动执行指定函数?
C#程序集加载时自动执行指定函数的实现思路
以下是几种可行的实现方案,可根据场景选择合适的方式:
1. 模块初始化器(C# 9.0+ 推荐)
如果项目使用C# 9.0及以上版本,这是最直接的方案。利用[ModuleInitializer]特性标记的静态无参数方法,会在程序集加载完成、模块初始化时自动执行,无需额外触发。
示例代码(目标程序集中):
using System.Runtime.CompilerServices; public class Test { [ModuleInitializer] public static void whatever() { // 这里写需要自动执行的逻辑 Console.WriteLine("程序集加载,自动执行whatever方法"); } }
注意:标记该特性的方法必须是静态、无参数、返回值为void,整个模块中可存在多个模块初始化器,它们会按特定顺序执行。
2. 订阅AppDomain的AssemblyLoad事件
在当前应用域中监听程序集加载事件,当目标程序集被加载时,通过反射调用指定方法。这种方案无需修改目标程序集,适合无法修改原有程序集的场景。
示例代码(调用方程序中):
// 订阅事件 AppDomain.CurrentDomain.AssemblyLoad += OnAssemblyLoaded; static void OnAssemblyLoaded(object sender, AssemblyLoadEventArgs args) { Assembly loadedAssembly = args.LoadedAssembly; // 校验目标程序集,可通过名称、版本等判断 if (loadedAssembly.GetName().Name.Equals("YourTargetAssemblyName", StringComparison.OrdinalIgnoreCase)) { // 反射获取目标方法并执行 Type testType = loadedAssembly.GetType("YourNamespace.Test"); if (testType != null) { // 静态方法调用 MethodInfo method = testType.GetMethod("whatever", BindingFlags.Public | BindingFlags.Static); method?.Invoke(null, null); // 实例方法调用(需先创建实例) // MethodInfo method = testType.GetMethod("whatever", BindingFlags.Public | BindingFlags.Instance); // object instance = Activator.CreateInstance(testType); // method?.Invoke(instance, null); } } } // 加载程序集时会触发事件 Assembly.Load("YourTargetAssemblyName");
3. 静态构造函数触发
利用类的静态构造函数特性:当类第一次被访问(如获取类型、调用静态成员)时,静态构造函数会自动执行。可在目标程序集中定义一个静态类,在其静态构造函数中调用目标方法,程序集加载后主动触发类的初始化即可。
示例代码(目标程序集中):
public static class AssemblyInitializer { static AssemblyInitializer() { // 调用目标方法 Test.whatever(); } } public class Test { public static void whatever() { Console.WriteLine("通过静态构造函数触发执行"); } }
调用方加载程序集后触发初始化:
Assembly assembly = Assembly.Load("YourTargetAssemblyName"); // 获取类型会触发静态构造函数 assembly.GetType("YourNamespace.AssemblyInitializer");
4. 自定义加载封装
如果程序集的加载流程由你控制,可以封装一个加载方法,在加载完成后直接调用目标方法。这种方式逻辑简单,适合统一管理加载行为的场景。
示例代码:
public static Assembly LoadAssemblyWithInitialization(string assemblyPath) { Assembly assembly = Assembly.LoadFrom(assemblyPath); // 执行指定方法 Type testType = assembly.GetType("YourNamespace.Test"); if (testType != null) { MethodInfo method = testType.GetMethod("whatever"); if (method != null) { object instance = Activator.CreateInstance(testType); method.Invoke(instance, null); } } return assembly; } // 使用自定义方法加载 LoadAssemblyWithInitialization(@"C:\Path\To\YourAssembly.dll");
内容的提问来源于stack exchange,提问作者yair koskas
相关产品推荐
相关产品推荐

