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

相同代码与依赖下,两VS解决方案抛出不同OpenXml异常的原因

异常差异原因分析

导致两个解决方案抛出不同异常的核心原因在于项目结构、运行时环境以及文件/依赖加载机制的差异,具体拆解如下:

1. 运行时工作目录不一致

  • 在openxml-exceptions.sln中,控制台项目call-basic-example(netcoreapp3.1)的运行工作目录是其自身的输出目录(如bin/Debug/netcoreapp3.1)。如果basic-example类库代码中使用了相对于类库项目目录的相对路径(比如读取模板文件),控制台运行时会以自身输出目录为基准查找路径,导致找不到目标目录,触发DirectoryNotFoundException。
  • 在openxml-exceptions-reference.sln中,basic-example作为独立控制台项目,运行工作目录是它自己的输出目录。如果代码中传递的路径参数本身存在格式问题(比如空字符串、包含非法字符),会直接触发ArgumentException,而非目录找不到的异常。

2. .NET运行时环境与依赖加载逻辑差异

  • openxml-exceptions.sln使用netcoreapp3.1控制台+netstandard2.0类库的组合,CoreCLR运行时会从应用程序基目录(控制台输出目录)加载依赖。如果DocumentFormat.OpenXml依赖的原生组件(如压缩处理相关库)未被正确复制到控制台输出目录,运行时会因找不到组件所在目录抛出DirectoryNotFoundException。
  • 注意:netstandard2.0本身是类库规范,不能直接作为可执行项目,你提到的第二个解决方案中的basic-example应该是基于.NET Framework或其他可执行运行时的控制台项目。这类运行时(比如.NET Framework)的依赖加载逻辑不同,会优先检查路径参数的合法性,若参数无效(如空路径)会直接抛出ArgumentException,而非进入目录查找流程。

3. 项目输出文件的复制行为差异

  • 在多项目解决方案中,类库的附属文件(如模板、配置)需要通过项目设置(“复制到输出目录”)同步到控制台项目的输出目录。如果这些文件/目录未被正确复制,运行时会找不到对应目录,触发DirectoryNotFoundException。
  • 单项目解决方案中,所有文件的复制行为由自身控制,若路径参数本身不符合要求,会先触发参数合法性校验的ArgumentException。

验证步骤

  • 打印运行时工作目录:在代码中添加Console.WriteLine(System.IO.Directory.GetCurrentDirectory());,对比两个项目的输出结果。
  • 检查路径参数:确认代码中传递给OpenXml API的路径是否为空、包含非法字符,或与运行时工作目录不匹配。
  • 对比输出目录结构:查看两个项目的bin/Debug目录,检查是否缺少必要的文件或目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:20:34