配置文件作为嵌入式资源

时间:2009-01-20 18:54:12

标签: .net configuration

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:7)

我认为将配置文件作为嵌入式资源并不是一个想法。嵌入式资源被打包到dll中,之后无需重新编译就无法更改配置(首先是配置文件的想法)。

答案 1 :(得分:4)

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

这有很多用途:

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

    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

    希望这有帮助, 最大

答案 2 :(得分:3)

我通常有一个类在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);
        }
    }