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
相关产品推荐
相关产品推荐

