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

C# XLL依赖加载失败时,如何终止触发调用的目标方法?

解决方案:在不终止XLL的前提下终止触发AssemblyResolve的调用方法

核心思路

要实现只终止当前触发程序集解析的调用方法、同时保留XLL整体运行,关键是用自定义异常替代返回null,让上层调用逻辑精准捕获并处理程序集缺失的情况,避免CLR抛出未处理的通用异常导致XLL崩溃。

具体实现步骤

1. 定义自定义异常类

创建专属异常来标记「预期的程序集缺失」场景,方便上层区分处理:

public class MissingRequiredAssemblyException : Exception
{
    public MissingRequiredAssemblyException(string assemblyName) 
        : base($"依赖程序集 {assemblyName}.dll 缺失,请确认安装路径是否正确。")
    {
        AssemblyName = assemblyName;
    }

    public string AssemblyName { get; }
}

2. 修改AssemblyResolve事件处理逻辑

只处理预期的依赖程序集,捕获缺失时抛出自定义异常,而非返回null:

private static Assembly AssemblyResolve(object sender, ResolveEventArgs args)
{
    string dependentAssemblyName = new AssemblyName(args.Name).Name;
    // 仅处理预先定义的目标依赖程序集,避免干扰系统程序集加载
    var expectedAssemblies = new HashSet<string> { "SIMExporterEbmlImport", "其他依赖的程序集名称" };
    if (!expectedAssemblies.Contains(dependentAssemblyName))
    {
        return null; // 非预期程序集,交给CLR默认逻辑处理
    }

    string dependentAssemblyLocation = @"C:\ProgramData\EB Bridging Tools\SimExporter\" + dependentAssemblyName + ".dll";

    try
    {
        return Assembly.LoadFile(dependentAssemblyLocation);
    }
    catch
    {
        // 抛出自定义异常,让上层调用者捕获处理
        throw new MissingRequiredAssemblyException(dependentAssemblyName);
    }
}

3. 上层调用方法捕获异常并终止

在触发第三方程序集加载的Excel函数/方法中,捕获自定义异常,处理后返回Excel可识别的错误值,终止当前方法:

// 示例:Excel中暴露的自定义函数
public static object GetEBData(string parameters)
{
    try
    {
        // 此代码会触发第三方程序集加载,进而进入AssemblyResolve事件
        var exporter = new SIMExporterEbmlImport.Exporter();
        return exporter.FetchData(parameters);
    }
    catch (MissingRequiredAssemblyException ex)
    {
        MessageBox.Show(ex.Message, "DataTool - Get EB Data", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return ExcelError.ExcelErrorValue; // 返回Excel可识别的错误标识,终止当前调用
    }
    catch (Exception ex)
    {
        // 处理其他非程序集缺失的异常
        MessageBox.Show($"获取数据失败:{ex.Message}", "DataTool - Get EB Data", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return ExcelError.ExcelErrorValue;
    }
}

关键说明

  • 限制处理范围:只在AssemblyResolve中处理预期的依赖程序集,避免影响系统程序集的正常加载逻辑。
  • 异常精准捕获:自定义异常让上层能区分「预期的程序集缺失」和其他意外错误,仅终止当前调用流程,不影响XLL的其他功能。
  • 友好返回值:返回Excel标准错误值,避免Excel弹出系统级异常弹窗,保证用户体验。

内容的提问来源于stack exchange,提问作者RobBaker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:11:21