C# 在2个应用程序之间共享配置
感觉这应该有一个简单的解决方案 我正在开发一个工具,它将有几个组件-它将作为一个命令行工具开始,然后我们将包装在一个wpf应用程序中。该工具用于生成数据库迁移脚本。这些将是源代码控制的,并且位于每个用户机器上的特定位置 我想将此位置存储为一个设置,该设置不需要提供给命令行程序,并且可以在UI版本中设置。也可能有其他信息可以在程序之间共享(以一次/很少的方式) 我不想在代码中有一个硬编码的配置文件路径,因为它不能在程序的不同用户之间移植 我知道我可以将目录名传递给命令行应用程序,也可以通过在机器上手动设置一次应用程序配置来实现。我不喜欢前者,因为它是重复的,在命令行上键入路径是一件痛苦的事情,我不喜欢后者,因为如果你需要更改它,那么你必须弄清楚程序在做什么,然后在随机文件夹中进行挖掘,手动修改文件(这同样非常可怕!) 这似乎是一个应该解决的问题,而且很可能是——我觉得我可能在某个地方错过了一个窍门 我不担心使用本机设置对象——在许多方面,我更希望它只是一个xml文件,因为这样可以使升级或向其中添加新内容保持良好和简单 请给我一些想法C# 在2个应用程序之间共享配置,c#,configuration,C#,Configuration,感觉这应该有一个简单的解决方案 我正在开发一个工具,它将有几个组件-它将作为一个命令行工具开始,然后我们将包装在一个wpf应用程序中。该工具用于生成数据库迁移脚本。这些将是源代码控制的,并且位于每个用户机器上的特定位置 我想将此位置存储为一个设置,该设置不需要提供给命令行程序,并且可以在UI版本中设置。也可能有其他信息可以在程序之间共享(以一次/很少的方式) 我不想在代码中有一个硬编码的配置文件路径,因为它不能在程序的不同用户之间移植 我知道我可以将目录名传递给命令行应用程序,也可以通过在机器上
我想,您可以使用
machine.config
来存储全局可见的条目
您可以根据目标.net framework和操作系统位来定位它
c:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\
c:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\
注意:如果您在64位环境中,则有两个machine.config文件。一个用于Framework64,一个用于Framework。确保它是正确的,或者两者都正确。我所从事的项目最终只是一个命令行工具的集合,其中一些工具是在其他工具之上构建的 这些设置实际上不是设计用来从命令行使用的——我已经记录了我在中遇到的许多痛苦。在经历了所有这些之后,我最终发现它们在跨程序集时不起作用-如果你调用一个程序集,它具有来自另一个程序集的设置,你将获得新的设置,而不是另一个程序集在自己运行时将使用的设置 我最终解决这个问题的方法就是用手来做。说到底,自己写东西并不难 它的架构与图书馆的架构非常相似: 主类如下所示:
public class ProgramSettings
{
private readonly string _path;
private readonly List<Setting> _settings;
private readonly SettingProvider _settingProvider;
private readonly ConsoleWriter _writer;
public ProgramSettings(string programName, SettingProviderFactory settingProviderFactory, ConsoleWriter writer)
{
_writer = writer;
var appData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
var folder = Path.Combine(appData, companyName, programName);
_path = Path.Combine(folder, "settings.xml");
_settings = new List<Setting>();
if (!Directory.Exists(folder))
Directory.CreateDirectory(folder);
_settingProvider = settingProviderFactory.GetProvider(_path, _settings);
}
public Setting Add(string name, string description)
{
var setting = new Setting(name, description);
_settings.Add(setting);
return setting;
}
public string Load()
{
_settingProvider.Load();
_writer.WriteLine("using config at " + _path);
if (_settings.All(s => s.IsSet))
return null;
_settingProvider.Save();
var description = string.Join("\n", _settings.Where(s => !s.IsSet).Select(s => s.Description));
return description + "\n need setting in config";
}
}
public class Setting
{
private readonly string _description;
public string Name { get; private set; }
public Setting(string name, string description)
{
Name = name;
_description = description;
}
public string Value { get; set; }
public string Description
{
get { return string.Format("{0}: {1}", Name, _description); }
}
public bool IsSet
{
get { return Value != null; }
}
}
除此之外,您只需要根据我省略的设置写出一个xml文件,再加上一些简单的接口+为简洁起见硬编码的公司名称。硬编码路径似乎不是一个好办法-我不能假设人们有一个c驱动器thing@JonnyLeeds,在评论之前,请仔细阅读问题和建议答案。我提到的是您可能找到.NET安装和机器配置文件的位置,而不是任何硬编码的路径。您能否提供有关如何使用设置执行此操作的更多信息(我认为默认设置现在应该可以)。我是否需要在不同的项目中保持设置同步?这似乎有点恶心。设置通常是透明存储的,您如何选择它们的位置?有人提到某个地方有Environment.AppData或类似内容,因此这看起来像是一种方法,您可以使用configSource属性将userSettings部分的内容移动到外部文件中。然后这个外部文件可以在两个应用程序之间共享。但是,这种方法有一些限制,因为这个外部文件不能放在任何地方。它必须与主配置文件位于同一目录或子目录中。如果您想要更灵活的解决方案,您必须编写自己的设置提供程序。