配置文件作为嵌入式资源

8

有没有人能提供VB.NET或C#中使用嵌入式配置文件的示例?我知道如何嵌入配置文件,但之后访问它的最佳方法是什么?我可以像使用外部配置文件一样处理它吗?

非常感谢任何帮助。

3个回答

7

我认为将配置文件作为嵌入式资源并不是一个好主意。嵌入式资源被打包进dll中,如果要更改配置,就需要重新编译(而这正是配置文件的初衷所在)。


14
有些配置仅用于开发目的,而不是部署配置。这个功能仍然是必要的。 - rjarmstrong
2
好的,那么有几种方法可以做到这一点。我的观点是,在这种情况下,在设置(静态)类中使用硬编码常量比从配置文件获取值要快得多。因为嵌入式资源需要重新编译才能更改值,所以拥有一个需要在其中更改一些值后重新编译的类并不会损失太多。另一种实现此目的的技术是为未在配置文件中找到的值提供默认值 - 这些值不需要在部署时指定,并且可以在开发环境中使用非嵌入式资源文件进行覆盖... - zappan
我该如何拥有一个单一的exe文件,可以在所有的.net框架中运行?是否有一种方法可以将app.config字符串嵌入到exe文件本身中? - Sujith H S

6

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

这对于许多目的非常有用:

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

以下是一个简单的示例:

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


1
为什么没有评论就给我点踩?如果上面的代码有问题,我很想知道原因,但是随意点踩并不是很有帮助... - Max Schilling
因为我认为这是一种优雅的方式,可以将上述方法结合起来,具有默认配置文件类型和内部类来处理默认值以及加载和保存配置文件...但我会将其实现为一个内部静态类,因为我想不到同时拥有两个单独的配置的好理由。 - Gooo

3

我通常会有一个类,将偏好保存在用户应用程序数据路径中的 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);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接