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

发布为单文件自包含后C#控制台应用参数处理异常求助

问题分析与解决方案

核心原因

你遇到的问题是单个自包含文件发布场景下,Assembly.GetExecutingAssembly().Location返回值无效导致的。

在普通Debug/Release模式(非单个文件发布)下,程序exe是磁盘上的独立文件,Assembly.Location能正确返回exe的路径,Path.GetDirectoryName可以拿到程序所在目录。但当你发布为单个自包含文件时,.NET会将所有依赖打包进一个exe,运行时程序从内存中加载,此时Assembly.Location会返回空字符串或null,进而导致Path.GetDirectoryName(null)返回null,后续调用Path.Combine时传入null参数,触发ArgumentNullException。

解决方案

替换获取程序目录的API,改用AppContext.BaseDirectory,这个API在单个文件发布场景下能稳定返回程序的运行目录:

修改你的代码:

if (string.IsNullOrEmpty(strWorkPath))
{
    // 单个文件发布时,用AppContext.BaseDirectory获取程序所在目录
    strWorkPath = AppContext.BaseDirectory;
}

如果你的需求是获取当前工作目录(而非程序所在目录),也可以使用Environment.CurrentDirectory,但注意这个值会随用户启动程序的路径变化而改变。

额外排查建议

  • 验证发布后的文件:确认发布输出目录只有一个exe文件,确保“单个文件”配置生效。
  • 添加调试日志:在代码中输出Assembly.GetExecutingAssembly().Location的值,确认单个文件发布时该值为null或空字符串。
  • 检查Path.Combine的调用:确保第135行的Path.Combine所有参数都不为null,避免因其他参数问题触发异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:40:57