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

发布后C#中Path.GetDirectoryName()返回null的原因排查

问题描述

开发的依赖数据库文件的C#程序,在Visual Studio中调试运行时,使用Path.GetDirectoryName()获取文件路径的代码正常工作;但发布生成可执行文件后,该函数返回null,调用Path.Combine()时触发错误。相关代码如下:

public class CargaDao 
{
    static private string caminhoDoBanco = "";

    public void inicializarBanco()
    {
        string diretorioBase = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        caminhoDoBanco = Path.Combine(diretorioBase, "Gollog.db");
    }
}
// 另有其他方法,暂不相关
问题原因与解决方案

核心原因

差异源于发布方式导致的程序集加载逻辑变化:

  • 调试阶段:程序集以独立的dll/exe文件形式存在于磁盘目录中,System.Reflection.Assembly.GetExecutingAssembly().Location能正确返回程序集的磁盘文件路径,因此Path.GetDirectoryName()可以拿到有效的目录路径。
  • 发布后(尤其是单文件发布):.NET从Core 3.0开始支持单文件打包发布,此时程序集直接在内存中加载,没有对应的磁盘文件路径,Assembly.Location会返回空字符串或无效值,调用Path.GetDirectoryName(null/空字符串)自然返回null,最终导致Path.Combine()报错。

修复方案

替换获取基础目录的方式,使用AppContext.BaseDirectory属性——该属性在调试、普通发布、单文件发布场景下都能稳定返回应用程序的基础目录:

public class CargaDao 
{
    static private string caminhoDoBanco = "";

    public void inicializarBanco()
    {
        string diretorioBase = AppContext.BaseDirectory;
        caminhoDoBanco = Path.Combine(diretorioBase, "Gollog.db");
    }
}

内容的提问来源于stack exchange,提问作者ale.dnts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:12:06