使用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
相关产品推荐
相关产品推荐

