发布为单文件自包含后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
相关产品推荐
相关产品推荐

