如何在dll编译后通过XML文件修改其内部常量供其他软件调用
核心问题解答
不能直接通过XML修改编译后dll中用const定义的常量。
C#中const修饰的是编译时常量,在dll编译阶段,所有引用该常量的位置都会被直接替换为对应的字面量值,甚至引用该dll的其他项目在编译时,也会把这个常量的值直接嵌入自身的IL代码中。哪怕你手动修改dll里的const定义,只要调用方没有重新编译,取值都不会变,完全不支持运行时动态调整。
满足动态调整需求的改造方案
你只需要把常量定义修改为运行时读取配置的属性即可,不需要改动其他调用方的引用代码,示例如下:
1. 改造原常量定义
public class UserInterfaceDefinitions { // 替换原有const定义,改为运行时读取配置的静态属性 public static string Plugin4 => PluginConfig.GetValue("Plugin4", ValidationConstants.Plugin4_text); }
2. 实现XML配置读取逻辑
你可以自己实现轻量的XML读取工具类,也可以直接用.NET自带的配置体系,下面是轻量实现示例:
using System.IO; using System.Xml.Linq; public static class PluginConfig { private const string ConfigFileName = "PluginSettings.xml"; private static XDocument _configDoc; private static readonly FileSystemWatcher _configWatcher; static PluginConfig() { LoadConfig(); // 配置文件变更自动重载,无需重启调用程序 _configWatcher = new FileSystemWatcher(AppContext.BaseDirectory, ConfigFileName); _configWatcher.Changed += (s, e) => LoadConfig(); _configWatcher.EnableRaisingEvents = true; } private static void LoadConfig() { var configPath = Path.Combine(AppContext.BaseDirectory, ConfigFileName); _configDoc = File.Exists(configPath) ? XDocument.Load(configPath) : new XDocument(new XElement("Settings")); } public static string GetValue(string key, string defaultValue = "") { return _configDoc.Descendants(key).FirstOrDefault()?.Value ?? defaultValue; } }
3. 新增XML配置文件
在调用dll的软件的根目录下新建PluginSettings.xml,内容示例:
<?xml version="1.0" encoding="utf-8"?> <Settings> <Plugin4>自定义的Plugin4文本值</Plugin4> </Settings>
实现效果
后续你只需要修改XML文件里对应节点的内容,dll被调用时返回的取值就会自动更新,不需要重新编译dll,也不需要重启调用的软件。
参考示意图

注意事项
- 如果已有第三方软件已经基于旧的
const版本的dll编译过,需要让第三方重新引用改造后的dll再编译一次,后续就可以直接通过XML调整取值,不需要再重新编译。 - 如果该常量被用作特性的参数,因为特性参数要求必须是编译时常量,这种场景下无法通过运行时配置修改,需要调整业务逻辑实现。
内容的提问来源于stack exchange,提问作者Osama Ahmed
相关产品推荐
相关产品推荐

