Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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
.net 作为嵌入式资源的配置文件_.net_Configuration - Fatal编程技术网

.net 作为嵌入式资源的配置文件

.net 作为嵌入式资源的配置文件,.net,configuration,.net,Configuration,有没有人举过在VB.NET或C#中使用嵌入式配置文件的例子?我知道如何嵌入配置文件,但是以后访问它的最佳方法是什么?我可以像处理外部配置文件一样将其视为配置文件吗 非常感谢您的帮助。我认为将配置文件作为嵌入式资源不是一个好主意。嵌入的资源被打包到dll中,在没有重新编译的情况下,您无法更改配置(这是配置文件的初衷)。您可以选择使用配置对象来包含任何配置设置的默认值。然后,您可以在配置对象的构造函数中,尝试使用app.config、数据库配置表等处的值覆盖默认配置值 这在许多方面都很有用: 单元测

有没有人举过在VB.NET或C#中使用嵌入式配置文件的例子?我知道如何嵌入配置文件,但是以后访问它的最佳方法是什么?我可以像处理外部配置文件一样将其视为配置文件吗


非常感谢您的帮助。

我认为将配置文件作为嵌入式资源不是一个好主意。嵌入的资源被打包到dll中,在没有重新编译的情况下,您无法更改配置(这是配置文件的初衷)。

您可以选择使用配置对象来包含任何配置设置的默认值。然后,您可以在配置对象的构造函数中,尝试使用app.config、数据库配置表等处的值覆盖默认配置值

这在许多方面都很有用:

  • 单元测试工具(如nUnit)需要特殊配置才能访问app.config
  • app.config文件的存在是不必要的,因为它将使用默认值(这似乎是您的目标)
  • 可以帮助确保类型安全的配置值
  • 一个简单的例子:

    public class MyConfiguration
    {
    
    
        private string _defaultValue1 = "Value1";
        private int _defaultValue2 = 22;
    
    
    
        public string Value1
        {
            get
            {
                return _defaultValue1;
            }
        }
    
        public int Value2
        {
            get
            {
                return _defaultValue2;
            }
        }
    
        #region cnstr
    
        public MyConfiguration()
        {
            LoadValuesFromConfigurationXml();
        }
    
        #endregion
    
    
        public static MyConfiguration GetConfig()
        {
            // Optionally Cache the config values in here... caching code removed 
            // for simplicity
            return new MyConfiguration();
        }    
    
        internal void LoadValuesFromConfigurationXml()
        {
            int tempInt;
    
            string value = ConfigurationManager.AppSettings["Value1"];
    
            if (!String.IsNullOrEmpty(value))
            {
                _defaultValue1 = value;
            }
    
            value = ConfigurationManager.AppSettings["Value2"];
    
            if (!String.IsNullOrEmpty(value))
            {
                if (int.TryParse(value, out tempInt))
                {
                    _defaultValue2 = tempInt;
                }
            }
    
    
        }
    
    }
    
    要访问配置值,请使用:MyConfiguration.GetConfig().Value1

    希望这有帮助,
    Max

    我通常有一个类,它将首选项保存在UserAppDataPath中的xml中。 比如:

    public class Preferences
        {
            public static String prefFile = "/preferences.xml";
            private static XmlDocument doc;
    
            public static void set(String prefName, String value)
            {
                XmlElement nnode = (XmlElement)root.SelectSingleNode("//" + prefName);
                if (nnode == null)
                {
                    nnode = doc.CreateElement(prefName);
                    root.AppendChild(nnode);
                }
                nnode.InnerText = value;
            }
            public static String get(String prefName)
            {
                XmlElement nnode = (XmlElement)root.SelectSingleNode("//" + prefName);
                if (nnode != null) return nnode.InnerText;
                return "";
            }
    
            private static XmlElement root
            {
                get
                {
                    if (doc == null)
                    {
                        doc = new XmlDocument();
                        try
                        {
                            doc.Load(Application.UserAppDataPath + prefFile);
                        }
                        catch (Exception)
                        {
                            doc.LoadXml("<root></root>");
                            NodeChangedHandler(null, null); // costringo a salvare.
                        }
                        doc.NodeChanged += new XmlNodeChangedEventHandler(NodeChangedHandler);
                        doc.NodeInserted += new XmlNodeChangedEventHandler(NodeChangedHandler);
                        doc.NodeRemoved += new XmlNodeChangedEventHandler(NodeChangedHandler);
                    }
                    return (XmlElement)doc.FirstChild;
                }
            }
            private static void NodeChangedHandler(Object src, XmlNodeChangedEventArgs args)
            {
                if (doc != null)
                    doc.Save(prefFile);
            }
        }
    
    公共类首选项
    {
    公共静态字符串prefFile=“/preferences.xml”;
    私有静态xml文档文档;
    公共静态无效集(字符串名称、字符串值)
    {
    XmlElement nnode=(XmlElement)root。选择SingleNode(“/”+prefName);
    如果(nnode==null)
    {
    nnode=doc.CreateElement(prefName);
    根追加子节点(nnode);
    }
    nnode.InnerText=值;
    }
    公共静态字符串get(字符串prefName)
    {
    XmlElement nnode=(XmlElement)root。选择SingleNode(“/”+prefName);
    如果(nnode!=null)返回nnode.InnerText;
    返回“”;
    }
    私有静态XmlElement根
    {
    得到
    {
    如果(doc==null)
    {
    doc=新的XmlDocument();
    尝试
    {
    doc.Load(Application.UserAppDataPath+prefFile);
    }
    捕获(例外)
    {
    doc.LoadXml(“”);
    NodeChangedHandler(null,null);//costringo a salvare。
    }
    doc.NodeChanged+=新的XMLnodeChangedHandler(NodeChangedHandler);
    doc.NodeInserted+=新的XMLNodeChangedHandler(NodeChangedHandler);
    doc.NodeRemoved+=新的XMLNodeChangedHandler(NodeChangedHandler);
    }
    返回(xmlement)doc.FirstChild;
    }
    }
    私有静态void NodeChangedHandler(对象src,XmlNodeChangedEventArgs)
    {
    如果(doc!=null)
    单据保存(预文件);
    }
    }
    
    某些配置仅用于开发目的,而不是部署配置。这个功能仍然是需要的。那么,有几种方法可以做到这一点。我的观点是,在这种情况下,设置(静态)类中硬编码的常量要比从配置文件中获取值快得多。因为嵌入式资源需要重新编译来更改值,所以在更改其中的某些值之后,拥有一个需要重新编译的类并不是一种损失。实现这一点的另一种技术是为配置文件中找不到的值提供默认值—这些值不需要为部署指定,并且可以在开发环境中使用非嵌入式资源文件覆盖这些值……如何使单个exe能够在所有.net框架中运行?有没有办法在exe本身中嵌入app.config字符串?为什么没有注释就进行向下投票?如果上面的代码有问题,我很想知道原因,但是随机的下一票没有多大帮助…上一票是因为我认为这是一种优雅的方式,可以将上面的方法结合起来,即使用任何类型的默认配置文件和内部类来处理默认值,以及加载和保存配置文件。。。但我将它实现为一个内部静态类,因为我想不出任何好的理由让两个单独的配置同时处于活动状态。