You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:50:54