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

使用Excel-DNA调试C#代码时当前目录异常及app.Config读取问题求助

解决Excel-DNA插件调试时当前目录切换导致app.config读取失败的问题

我之前用Excel-DNA开发C# Excel插件时也碰到过这个一模一样的坑!Excel运行时默认的当前工作目录就是用户的C:\Users\userX\Documents,而你的插件配置文件(xxx-addin.dll.config)其实是在项目的输出目录(比如bin/Debug),所以ConfigurationManager默认从当前目录找配置自然读不到内容。下面给你几个实用的解决办法:

方法1:手动加载插件目录下的配置文件

直接定位到插件程序集所在的目录,加载对应的配置文件,完全绕开当前目录的问题,这是最稳妥的方式:

using System.Configuration;
using System.IO;
using System.Reflection;

// 获取插件程序集的完整路径
string assemblyPath = Assembly.GetExecutingAssembly().Location;
// 拼接对应的.config文件路径
string configFilePath = Path.ChangeExtension(assemblyPath, ".config");

// 创建配置文件映射并加载
var configMap = new ExeConfigurationFileMap { ExeConfigFilename = configFilePath };
var config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);

// 读取配置项
string staticData = config.AppSettings.Settings["data"]?.Value;

方法2:启动时切换当前工作目录到插件目录

在插件初始化的时候(比如实现IExcelAddIn接口的AutoOpen方法),把当前工作目录切换到插件dll所在的目录,这样后续ConfigurationManager就能正常读取配置了:

using System.IO;
using System.Reflection;
using ExcelDna.Integration;

public class MyExcelAddIn : IExcelAddIn
{
    public void AutoOpen()
    {
        // 获取插件所在的目录
        string assemblyDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        // 设置当前工作目录
        Directory.SetCurrentDirectory(assemblyDirectory);

        // 现在再读取配置就正常了
        string staticData = ConfigurationManager.AppSettings["data"];
    }

    public void AutoClose()
    {
        // 可选:如果需要恢复初始的工作目录,可以在这里保存原目录并恢复
        // 比如在AutoOpen里先记录原目录:string originalDir = Directory.GetCurrentDirectory();
    }
}

方法3:不依赖app.config,改用资源文件或独立配置文件

如果不想跟ConfigurationManager打交道,也可以把静态数据嵌入到项目的资源文件里,或者放在插件目录下的JSON/XML文件中,直接读取文件内容:

// 读取插件目录下的json配置文件示例(需引用Newtonsoft.Json)
string assemblyDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string jsonPath = Path.Combine(assemblyDir, "settings.json");
string jsonContent = File.ReadAllText(jsonPath);
var settings = JsonConvert.DeserializeObject<MySettings>(jsonContent);
string staticData = settings.Data;

// 自定义配置类
public class MySettings
{
    public string Data { get; set; }
}

额外注意事项

  • 确保你的app.config的“复制到输出目录”属性设置为“始终复制”或“如果较新则复制”,这样编译时会自动生成xxx-addin.dll.config到输出目录;
  • 调试时,VS附加到Excel进程后,插件是从输出目录加载的,确认输出目录下存在对应的配置文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:21:06