Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在2个应用程序之间共享配置_C#_Configuration - Fatal编程技术网

C# 在2个应用程序之间共享配置

C# 在2个应用程序之间共享配置,c#,configuration,C#,Configuration,感觉这应该有一个简单的解决方案 我正在开发一个工具,它将有几个组件-它将作为一个命令行工具开始,然后我们将包装在一个wpf应用程序中。该工具用于生成数据库迁移脚本。这些将是源代码控制的,并且位于每个用户机器上的特定位置 我想将此位置存储为一个设置,该设置不需要提供给命令行程序,并且可以在UI版本中设置。也可能有其他信息可以在程序之间共享(以一次/很少的方式) 我不想在代码中有一个硬编码的配置文件路径,因为它不能在程序的不同用户之间移植 我知道我可以将目录名传递给命令行应用程序,也可以通过在机器上

感觉这应该有一个简单的解决方案

我正在开发一个工具,它将有几个组件-它将作为一个命令行工具开始,然后我们将包装在一个wpf应用程序中。该工具用于生成数据库迁移脚本。这些将是源代码控制的,并且位于每个用户机器上的特定位置

我想将此位置存储为一个设置,该设置不需要提供给命令行程序,并且可以在UI版本中设置。也可能有其他信息可以在程序之间共享(以一次/很少的方式)

我不想在代码中有一个硬编码的配置文件路径,因为它不能在程序的不同用户之间移植

我知道我可以将目录名传递给命令行应用程序,也可以通过在机器上手动设置一次应用程序配置来实现。我不喜欢前者,因为它是重复的,在命令行上键入路径是一件痛苦的事情,我不喜欢后者,因为如果你需要更改它,那么你必须弄清楚程序在做什么,然后在随机文件夹中进行挖掘,手动修改文件(这同样非常可怕!)

这似乎是一个应该解决的问题,而且很可能是——我觉得我可能在某个地方错过了一个窍门

我不担心使用本机设置对象——在许多方面,我更希望它只是一个xml文件,因为这样可以使升级或向其中添加新内容保持良好和简单

请给我一些想法

  • 当程序第一次运行时,您只能向用户请求一次目录。然后,您将在设置中存储提供的值,并在以后使用它。当然,您必须提供稍后重写此值的可能性
  • 若我理解正确,那个么您就不想让用户在一些“奇怪”的文件夹中查找配置文件。如果是这样,您可以考虑使用Engulo.GETFoFrEdPATH获取MyDebug、桌面或任何其他熟知目录的路径,并保存设置。
  • 至于设置。它们已经存储为XML。如果您不喜欢此XML的结构,可以创建自己的自定义设置提供程序(请阅读关于SettingsProviderAttribute的内容)。您还可以轻松创建自己的解决方案。创建一个具有某些属性的类并对其进行序列化/反序列化(例如使用XmlSerialzier)就足够了
    我想,您可以使用
    machine.config
    来存储全局可见的条目

    您可以根据目标.net framework和操作系统位来定位它

  • 对于.NET 2.0和3.5->
    c:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\
  • 对于.NET4.0 ->
    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文件,再加上一些简单的接口+为简洁起见硬编码的公司名称。

    硬编码路径似乎不是一个好办法-我不能假设人们有一个c驱动器thing@JonnyLeeds,在评论之前,请仔细阅读问题和建议答案。我提到的是您可能找到.NET安装和机器配置文件的位置,而不是任何硬编码的路径。您能否提供有关如何使用设置执行此操作的更多信息(我认为默认设置现在应该可以)。我是否需要在不同的项目中保持设置同步?这似乎有点恶心。设置通常是透明存储的,您如何选择它们的位置?有人提到某个地方有Environment.AppData或类似内容,因此这看起来像是一种方法,您可以使用configSource属性将userSettings部分的内容移动到外部文件中。然后这个外部文件可以在两个应用程序之间共享。但是,这种方法有一些限制,因为这个外部文件不能放在任何地方。它必须与主配置文件位于同一目录或子目录中。如果您想要更灵活的解决方案,您必须编写自己的设置提供程序。