[英]Sharing configuration between 2 applications
感觉这应该有一个简单的解决方案。
我正在开发一个包含几个组件的工具-它将从命令行工具开始,然后将其包装在wpf应用程序中。 该工具用于生成数据库迁移脚本。 这些将由源代码控制,并位于每个用户计算机上的特定位置。
我想将此位置存储为不需要提供给命令行程序的设置,并且可以在UI版本中进行设置。 可能还会有其他信息,在这样的程序之间共享(以一次/很少一次设置的方式)很有用。
我不想在代码中有指向配置文件的硬编码路径,因为该路径不会在程序的不同用户之间移植。
我知道我可以将目录名传递给命令行应用程序,也可以通过人们在其计算机上手动设置一次应用程序配置来实现。 我不喜欢前者,因为它是重复性的,并且在命令行上键入路径很麻烦,而我不喜欢后者,因为如果需要更改它,则必须弄清楚程序在做什么,然后在随机文件夹中四处挖掘手动修改文件(这又太可怕了!)。
看来这应该解决的问题很可能是-我觉得我可能在某个地方缺少技巧。
我不必担心使用本机的Settings对象-在许多方面,我希望它只是某个地方的xml文件,因为这样可以使升级或添加新东西变得轻松而简单。
请点子!
我想,您可以使用machine.config
来存储全局可见的条目。
您可以根据目标.net框架和OS位来定位它
c:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\CONFIG\\
c:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Config\\
我没有在不是基于Web的应用程序中使用过machine.config。 但是,值得一试。
您还可以找到一些示例代码在这里在MSDN。
注意:如果在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文件写出来的内容,为了简洁起见,我省略了一些内容,加上一些令人兴奋的接口+硬编码的公司名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.