.NET开源类库Nini手册(INI、XML、注册表的配置应用)-中文翻译
nini .net配置库()
vb代码的注释我保留了原文注释,它和c#注释的内容是一样的,下载链接在文章末尾。
1.简介
1.1什么是应用程序配置数据?
作为开发人员,您始终需要处理应用程序配置数据。常见的示例是ini 文件,xml文件, .net配置文件(也称为“ .config”),windows注册表和命令行(argv)参数。配置文件的优点是它们加载速度快,不占用大量空间且易于编辑。
1.2问题
尝试创建配置文件访问方案不能满足程序员或最终用户的需求。为了给出真实的生活场景,我为一个使用windows注册表api(应用程序编程接口)配置其原始程序的组织工作。后来,他们开发了自己的asp配置类。大约在同一时间,另一个小组开发了一个api,该api可从数据库中获取数据。然后,当asp.net出现时,他们开始使用web.config。在短短的几年之内,配置数据源的数量就从一增加到了四个!不用说,获取配置数据通常成为一项艰巨的任务。以下是可以改进配置管理的三个主要方面:
-
api
开发人员使用配置文件格式,以使其应用程序在尽可能短的时间内运行。但是,通常在事后才添加用于访问此数据的api,从而导致api不够灵活。在很小的应用程序中,这可能不是问题,但是随着程序代码库的增长,配置信息通常会遍及整个应用程序代码。 -
最终用户
配置文件通常不会考虑最终用户。通常,配置选项是简洁的编程术语,只有最勇敢的用户才敢更改它们。这导致开发人员不得不编写复杂的配置文件编辑器,或更糟糕的是,它们会完全重新设计其原始api。 -
多个配置源
随着您软件的成熟,添加更多应用程序配置类型的情况并不少见(例如我之前给您的示例)。这通常是由于合并其他项目中的代码,新的改进格式以及迁移到不同的编程平台而引起的。这迫使程序员学习多个api。最终结果是代码不一致,也不适合新程序员。不会替换旧的配置文件,因为程序员及其经理不适应更改成熟的代码。编辑文件的用户可以抵制此更改,因为他们希望不学习新的文件格式。
1.3介绍nini
nini是一个功能强大的 .net配置 库,旨在帮助快速构建高度可配置的应用程序。nini提供了一种解决方案,试图消除上述问题。它提供了一个大型功能集,可为您提供从概念到成熟产品的每个阶段都将使用的功能。这是通过简单但灵活的api实现的,该api提供了对基础配置源的抽象。它解决了我上面描述的所有问题。我们将在下面的示例中看到如何完成此操作。
2.入门
2.1一个简单的例子
为了向您展示nini如何解决这些问题,让我们来看一个示例。首先,让我们看一个示例配置文件。对于本手册中的大多数示例,我将选择ini 格式。ini文件是一种久经考验的真实配置文件类型,用于诸如mysql,php和samba之类的著名开源项目 。实际上,nini支持多种ini文件类型。它们非常简单且易于编辑,因此仍然是非常受欢迎的选择。nini包含它自己的ini解析器类(inidocument),该类 完全用c#编写,没有 windows api代码,因此它是跨平台的。这是此示例的myapp.ini文本:
; myapp.ini [logging] file name = myapp.log messagecolumns = 5 maxfilesize = 40000000000000
以下是一段c#示例代码,它描述了如何从上述文件中的ini文件访问配置数据:
using nini.config; iconfigsource source = new iniconfigsource("myapp.ini"); string filename = source.configs["logging"].get("file name"); int columns = source.configs["logging"].getint("messagecolumns"); long filesize = source.configs["logging"].getlong("maxfilesize");
这是vb中的示例:
imports nini.config dim source as new iniconfigsource("myapp.ini") dim filename as string = source.configs("logging").get("file name") dim columns as integer = source.configs("logging").getint("messagecolumns") dim filesize as long = source.configs("logging").getlong("maxfilesize")
好的,那个例子给您带来了一些麻烦。首先,我们使用nini.config将nini的配置名称空间包含在虚构的应用程序中。接下来,我们使用iniconfigsource 类加载ini文件。在nini中,每种配置文件类型都有其自己的“ source”类。此类知道如何加载和保存文件。这些类中的每一个都实现iconfigsource 接口,因此您可以更轻松地抽象地使用多种配置类型。加载文件后,所有部分(在本例中为[logging]部分)都将转换为接口iconfig。 并添加到source类的集合中。iconfig类提供了非常快速的访问权限,以检索,添加或删除配置密钥(例如上述ini文件中的“文件名”)。iconfig类的方法包括 get, getstring, getint, getfloat, getdouble和getlong 方法。所有以“ get”为前缀的方法都将重载以提供更多数据。接下来的几节描述了如何使用这些重载。
2.2默认值
有时,配置文件中不会出现选项。这可能是因为尚未将其添加到项目的主版本中,或者应将其对用户保密。对于这些情况,nini提供了重载的方法,这些方法允许程序员定义默认值。
这是c#中的示例:
// 将缺少默认值设置为 "default result". string missing = config.get("missing config", "default result"); // 设置smallnumber为默认值,50 int smallnumber = config.getint("not present", 50);
这是vb中的相同示例:
' sets missing to the default value, "default result". dim missing as string = config.get("missing config", "default result") ' sets smallnumber to the default value, 50. dim smallnumber as integer = config.getint("not present", 50)
2.3设置、保存和删除键
也可以设置新值并将其保存到配置文件中。调用set方法将更改现有值,或者如果不存在则将其添加。这是一个例子:
config.set("file name", "mynewfile.log"); config.set("messagecolumns", 45); config.remove("file name"); source.save();
但是,有必要调用save方法来保存文件,但是,您还可以在iconfigsource上设置autosave属性,并且每次调用set方法时,该属性都会自动保存文件。如果要将文档保存到其他路径或对象,则iniconfigsource, xmlconfigsource和dotnetconfigsource 类都保存重载的save方法,这些方法使您可以保存到新路径或textwriter:
这是c#中的示例:
using system.io; iniconfigsource source = new iniconfigsource("test.ini"); stringwriter writer = new stringwriter(); source.save(writer); // 保存到stringwriter(textwriter) source.save("some/new/path.ini"); // 保存到新路径
这是vb中的示例:
imports system.io dim source as iniconfigsource = new iniconfigsource("test.ini") dim writer as new stringwriter() source.save(writer) ' save to stringwriter(textwriter) source.save("some/new/path.ini") ' save to new path
2.4添加和删除配置
在特定情况下,您将需要自己添加和删除iconfigs。nini具有完成这两项操作的简单方法。这是我创建新配置然后立即将其删除的示例。
这是c#中的示例:
iconfig newconfig = source.addconfig("newconfig"); source.configs.remove(newconfig);
这是vb中的示例:
dim newconfig as iconfig = source.addconfig("newconfig") source.configs.remove(newconfig)
2.5键值扩展
在许多情况下,您会发现您的键值取决于其他键的值。例如,您有一个根路径配置值,以及使用此路径的文件的多个值,例如以下示例:
[file path] rootpath = c:\program files\my program logging = myapp.log webpage = index.html
如果没有nini,则如果要将“ rootpath”的值与“ logging”和“ webpage”结合使用,则必须执行难看的字符串连接才能获得“ c: program files my program index.html”。在nini中,您不需要这样做:
[file path] rootpath = c:\program files\my program logging = ${rootpath}\myapp.log webpage = ${rootpath}\index.html
这可以为您自己串联它们省去很多麻烦,并使您的代码更整洁。如果要从其他部分获取值,则可以执行上述操作,但是要在部分名称后添加一个横条(“ |”),如下所示:$ {section | key}。当您准备执行替换时,请调用expandkeyvalues(注意:以前称为replacekeyvalues)
这是c#中的示例:
iconfigsource source = new iniconfigsource("myapp.ini"); source.expandkeyvalues();
这是vb中的示例:
dim source as new iconfigsource("myapp.ini") source.expandkeyvalues()
调用expandkeyvalues时,它会一次更改配置文件中的所有键。这使代码执行更快,因为它不需要替换每个get / getstring / getint / etc调用上的键值。但是,这意味着如果要使用保存配置文件,它将用扩展值覆盖以前的值。如果您不希望发生这种情况,则可以使用getexpanded方法。
; 这会将日志记录设置为 "c:\program files\my program\myapp.log" iconfigsource source = new iniconfigsource("myapp.ini"); string logging = source.configs["file path"].getexpanded("logging");
这就是创建第一个nini配置的应用程序很容易。以下各节将介绍nini的一些更高级的功能。
3.高级主题
3.1合并
合并是一项非常强大的功能,允许开发人员将来自多个源的配置数据组合到一个对象中。您可以将无数种不同的配置类型组合到一个iconfigsource中!您可以将多个ini,xml和注册表文件添加到同一对象中。你觉得很酷吗?这是一个如何将ini文件与xml文件合并的示例。
这是c#中的示例:
iconfigsource mainsource = new iniconfigsource("myapp.ini"); iconfigsource xmlsource = new xmlconfigsource("myapp.xml"); mainsource.merge(xmlsource); // 现在,您可以从mainsource和xmlsource访问任何iconfig string xmlvalue = mainsource.configs["somexmlsection"].get("anoption");
这是vb中的示例:
dim mainsource as new iniconfigsource("myapp.ini") dim xmlsource as new xmlconfigsource("myapp.xml") mainsource.merge(xmlsource) ' now you can access any iconfig from mainsource and xmlsource dim xmlvalue as string = mainsource.configs("somexmlsection").get("anoption")
当数据在文件之间合并时,任何同名的iconfig或包含相同密钥的iconfig都将覆盖之前的文件。对于具有不同配置需求的客户端的用户来说,这非常重要。您可以在一个文件中创建默认配置设置,并具有特定于客户端的文件,如果需要,该文件将覆盖主文件的设置。这将节省您大量的工作。它对我有用。
3.2价值别名
许多配置文件的选项对于程序员来说是清楚的,但对非程序员来说却很混乱。为了使非程序员更容易理解配置文件,一种常见的做法是使键和值更像普通的人类对话框那样读取。让我们看一个示例,说明如何使用易于理解的字符串值返回布尔值。首先,让我们从aliasexample ini文件开始:
; aliasexample.ini [web browser] block popups = on check for default browser = off error level = warn
如您所见,我不是使用每个键的值都使用“ 1”或“ true”之类的值,而是使用了“ on”和“ off”,希望它们可以使用户更容易理解。您还将注意到,每个值之间的大小写不完全是大写或小写。我这样做是为了提出观点。用户很难记住要在特定键值中放置什么值,因此要使它们变得更容易一点也不 要使他们也记住要使用哪种情况!忽略大小写的问题是您的代码看起来很丑陋,如以下示例所示:
bool blockpopups = (config.get("block popups").tolower() == "on");
让我们为该文件定义一些规则,使它们成为规则。我们希望 blockpopups部分的 值在值设置为“ on”时返回布尔值true,而在值设置为“ off”时返回false值。此外,我希望错误级别将整数值设置为“ warn”时返回100,而将值设置为“ error”时返回200。下面的代码显示如何向iconfigsource的alias属性添加规则,该属性定义了我在上一段中刚刚定义的规则。
这是c#中的示例:
iconfigsource source = new iniconfigsource("aliasexample.ini"); // 创建两个布尔别名。 source.alias.addalias("on", true); source.alias.addalias("off", false); // 设置两个整数别名。 source.alias.addalias("error level", "warn", 100); source.alias.addalias("error level", "error", 200); iconfig config = source.configs["web browser"]; bool blockpopups = config.getboolean("blockpopups"); int errorcode = config.getint("error code", true);
这是vb中的示例:
dim source as new iniconfigsource("aliasexample.ini") ' creates two boolean aliases. source.alias.addalias("on", true) source.alias.addalias("off", false) ' sets two integer aliases. source.alias.addalias("error level", "warn", 100) source.alias.addalias("error level", "error", 200) dim config as iconfig = source.configs("web browser") dim blockpopups = config.getboolean("blockpopups") int errorcode = config.getint("error code", true)
对addalias的前两个调用 将布尔值添加到文本“ on”和“ off”。此方法的接下来的两个调用将别名文本添加到“错误级别”配置中,并将文本分别为“警告”和“错误”以及数字值100和200。接下来,我获取了关键数据。getint方法已重载,因此,如果参数设置为true,则它将以别名而不是文字整数值加载数据。
3.3键值清单
nini没有用于返回信息列表的专用方法。这是因为 .net framework 的string.split方法已经有了使用小技巧的 方法。这是一个ini文件,其中服务器列表由竖线(“ |”)分隔符分隔:
[mailservers] serverlist = "http://mail.yahoo.com/|http://www.hotmail.com/|http://www.mail.com/"
现在,使用split方法,我们将服务器列表作为字符串数组返回:
string[] serverlist = source.configs["mailservers"].get("serverlist").split('|');
这是vb中的示例:
dim serverlist() as string = source.configs("mailservers").get("serverlist").split('|')
您可以使用split方法使用任意数量的分度器。要有创造力。只需选择一个不会用作键值的分度符即可。
3.4活动
nini允许开发人员以非连接方式执行操作,从而使事情变得容易。通常,第一个对象可以只使用iconfig,而不必担心其他对象如何使用它。但是,有时候知道更改配置数据的时间很有用。nini添加了许多事件来帮助处理这些情况。
在以下情况下,类需要在保存iconfigsource时通知。
这是一个c#示例:
void sourceload() { source = new iniconfigsource(); source.saved += new eventhandler(this.source_saved); } void source_saved(object sender, eventargs e) { // 在这里执行保存操作 }
这是一个vb示例:
sub sourceload() { source = new iniconfigsource() source.saved += new eventhandler(me.source_saved) } sub source_saved(sender as object, e as eventargs) handles source.saved { ' perform save actions here }
还有更多事件,例如load,keyset,keyremoved,configadded和configremoved。
4.配置类型
4.1 ini文件
nini具有使用100%c#编写的内置ini解析器。这意味着,与其他ini解析器不同,它将在任何.net平台上运行,而不仅仅是运行windows的平台。另外,解析器的编写旨在提高灵活性,这就是为什么它支持多种ini文件类型的原因。当前支持的文件类型如下:
- windows style (win32 api getprivateprofilestring)
- mysql style
- python style
- samba style
- nini standard
区分大小写
iniconfigsource类具有一个允许值不区分大小写的属性。对于使用不区分大小写的旧win32 api getprivateprofilestring函数从系统升级软件的人们,这可能是理想的。这是一个如何使用它的示例:
; 注意,load方法只是将文件名传递给构造函数的替代方法。 iconfigsource source = new iniconfigsource(); source.load("myapp.ini"); source.casesensitive = false;
4.2 xml文件
nini拥有自己的xml配置文件结构。与.net配置文件格式相比,它提供了更大的灵活性。它的主要优点是您可以拥有多个xml配置文件,并且格式更加简洁。这是格式的示例。您会发现它非常类似于ini文件。配置值与先前示例中的ini相同:
<!-- myapp.xml --> <nini> <section name="logging"> <key name="file name" value="myapp.log" /> <key name="messagecolumns" value="5" /> <key name="maxfilesize" value="40000000000000" /> </section> </nini>
加载文件非常简单:
// 加载xml文件 xmlconfigsource source = new xmlconfigsource("myapp.xml"); // 检索值 long maxfilesize = source.configs["logging"].getlong("maxfilesize");
这是vb中的示例:
' loads the xml file dim source as new xmlconfigsource("myapp.xml") ' retrieves a value dim maxfilesize as long = source.configs("logging").getlong("maxfilesize")
4.3 windows注册表配置
如果您使用的是许多microsoft windows操作系统之一,则可以从windows注册表访问数据。这是注册表项的示例键路径:
hkey_local_machine\sofware\myapp\logging "file name" "myapp.log" reg_sz "messagecolumns" "5" reg_dword "maxfilesize" "40000000" reg_dword
要访问此代码,该方法比其他方法要复杂一些。您必须创建到注册表项的映射。此功能还将使您能够将许多注册表项合并到一个iconfigsource中。这是一些访问它的示例代码。
这是c#中的示例:
using microsoft.win32; registryconfigsource source = new registryconfigsource(); // 加载注册表树 source.addmapping(registry.localmachine, "software\\myapp\\logging"); // 检索值 long maxfilesize = source.configs["logging"].getlong("maxfilesize");
这是vb中的示例:
imports microsoft.win32 dim source as new registryconfigsource() ' loads the registry tree source.addmapping(registry.localmachine, "software\\myapp\\logging") ' retrieves a value dim maxfilesize as long = source.configs("logging").getlong("maxfilesize")
如果您想递归地检索指定注册表项下的所有数据,也可以使用一种方法来完成。
如果要使所有子键位于具有统一名称的键下,则可以执行以下操作:
using microsoft.win32; // 加载注册表树及其下的所有节点 registryconfigsource source = new registryconfigsource(); source.addmapping(registry.localmachine, "software\\myapp", registryrecurse.flattened); string maxfilesize = source.configs["myapp"].getstring("someconfig"); long maxfilesize = source.configs["logging"].getlong("maxfilesize");
这是vb中的示例:
imports microsoft.win32 ' loads the registry tree and all nodes beneath it without dim source as new registryconfigsource() source.addmapping(registry.localmachine, "software\\myapp", registryrecurse.flattened) dim maxfilesize as string = source.configs("myapp").getstring("someconfig"); dim maxfilesize as long = source.configs("logging").getlong("maxfilesize")
4.4 .net配置文件
.net framework具有使用特定xml格式的自己的配置文件机制 。您可能在asp.net中以web.config 文件的形式熟悉它们。如果将它们与windows窗体,控制台应用程序或服务一起使用,则将它们称为[app name] .exe.config文件。为了支持仍在其应用程序中使用此配置文件格式的用户,nini也支持这些文件。
<!-- exampleapp.exe.config --> <configuration> <configsections> <section name="logging" type="system.configuration.namevaluesectionhandler" /> </configsections> <logging> <add key="file name" value="myapp.log" /> <add key="messagecolumns" value="5" /> <add key="maxfilesize" value="40000000000000" /> </logging> </configuration>
访问数据与加载ini或xml文件非常相似:
iconfigsource source = new dotnetconfigsource(dotnetconfigsource.getfullconfigpath()); string filename = source.configs["logging"].get("file name"); int columns = source.configs["logging"].getint("messagecolumns"); long filesize = source.configs["logging"].getlong("maxfilesize");
这是vb中的示例:
dim source as new dotnetconfigsource(dotnetconfigsource.getfullconfigpath()) dim filename as string = source.configs("logging").get("file name") dim columns as integer = source.configs("logging").getint("messagecolumns") dim filesize as long = source.configs("logging").getlong("maxfilesize")
4.5命令行(argv)配置
自从编程开始以来,应用程序就具有接受命令行开关的能力。这些开关只是在应用程序首次启动时传递给应用程序的字符串。windows程序xcopy具有许多命令行 开关 ,而出色的下载应用程序wget也具有其自己的 。如果您想更多地了解.net中命令行参数的工作方式, 请单击此处(链接无效)。我们的第一个示例与您迄今为止看到的其他示例非常相似。区别在于 addswitch 需要为每个键配置调用方法。有一个短键和一个长键可用于获取配置数据。
这是c#中的示例:
public static int main(string[] args) { argvconfigsource source = new argvconfigsource(args); source.addswitch("logging", "file-name", "f"); source.addswitch("logging", "columns", "c"); source.addswitch("logging", "max-file-size", "m"); if(args.length > 0) { string filename = source.configs["logging"].get("file-name"); int columns = source.configs["logging"].getint("columns"); long filesize = source.configs["logging"].getlong("max-file-size"); } }
这是vb中的示例:
public static function main(args() as string) as integer dim source as new argvconfigsource(args) source.addswitch("logging", "file-name", "f") source.addswitch("logging", "columns", "c") source.addswitch("logging", "max-file-size", "m") if (args.length > 0) then dim filename as string = source.configs("logging").get("file-name") dim columns as integer = source.configs("logging").getint("columns") dim filesize as long = source.configs("logging").getlong("max-file-size") end if end function
5.有效使用nini
5.1多个用户的处理配置
您可能会注意到,.net 1.0和1.1的configurationsettings类仅提供检索配置值的方法。这是因为对于程序员来说,以编程方式更改整个应用程序的配置值通常是一个坏主意。全局配置应用程序的方式由管理员决定。因此,我建议您不要更改应用程序级别设置。
但是,至关重要的是,您必须允许用户根据自己的个人喜好配置应用程序。nini允许您创建许多不同的配置文件源,因此只需将配置文件放在正确的目录中即可。windows程序的标准是应用程序数据目录:
c:\documents and settings[username]\local settings\application data[application name]\settings.ini
您可以通过以下路径以编程方式获取此路径:
string folder = environment.getfolderpath(environment.specialfolder.applicationdata);
5.2在数据库中存储配置数据
如果您正在运行asp.net应用程序,则每个系统中可能会有多个用户。您可能还需要编辑许多用户设置。大多数web应用程序都完全配置有数据库,因此以下是将nini与数据库一起使用的示例。
这是一个带有sql server表的非常简单的示例。这可以很容易地适应任何其他数据库。这是数据库表的结构:
create table usersettings ( userid id, settings text );
configsettings字段存储nini配置值。现在,您可以像这样加载nini配置值:
string userid = getuserid(); // retrieve the user id somehow sqlcommand command = new sqlcommand("select settings from usersettings where id = " + userid, connection); connection.open(); sqldatareader reader = command.executereader(); if(reader.hasrows) { reader.read(); iconfigsource source = new xmlconfigsource(new stringreader(reader.getstring(0))); } reader.close(); connection.close();
5.3自动创建配置文件
对于任何开发项目而言,能够自动创建构建都是必不可少的。有几种工具可以完成此任务,例如批处理(.bat)脚本,但是.net framework最受欢迎的选择可能是 nant。您可能会发现自己需要使用构建管理系统来创建配置文件。为了使这些工作更轻松,nini项目提供了niniedit(nini命令行配置编辑器)。使用此应用程序,您可以创建和编辑任何基于文件的配置数据。ninieditor包含在examples目录中的每个nini版本中。
让我们添加一个示例,说明如何在构建中使用niniedit。在第一个示例中,假设您的构建是一个批处理文件,并且您需要以编程方式创建以下ini文件:
[general] debug = false logging = on [logging] filepath = c:\temp\myapp.log
以下调用将自动创建配置文件:
:: create the new configuration file niniedit --new --set-type=ini myapp.ini niniedit --add=general myapp.ini niniedit --add=logging myapp.ini niniedit --config=general --set-key=debug,false myapp.ini niniedit --config=general --set-key=logging,on myapp.ini niniedit --config=logging --set-key=filepath,c:\temp\myapp.log myapp.ini
如果您在nant中执行相同的操作,则可以执行以下操作:
<exec program="niniedit" commandline="-n -s ini myapp.ini" /> <exec program="niniedit" commandline="-a general myapp.ini" /> <exec program="niniedit" commandline="-a logging myapp.ini" /> <exec program="niniedit" commandline="-c general -k debug,false myapp.ini" /> <exec program="niniedit" commandline="-c general -k logging,on myapp.ini" /> <exec program="niniedit" commandline="-c logging -k filepath,c:\temp\myapp.log myapp.ini" />
这里的所有都是它的。niniedit具有其他功能,例如列出配置,键,键值和删除键的功能。如果没有其他问题,请以niniedit为例,说明如何使用nini编写自己的命令行应用程序。
5.4以编程方式创建配置文件
有时,使用应用程序以编程方式创建配置文件可能会很有用。使用nini进行此操作非常容易。
假设您要创建在任一示例中创建的相同ini文件:
[general] debug = false logging = on [logging] filepath = c:\temp\myapp.log
在代码中创建代码的方法如下:
iniconfigsource source = new iniconfigsource(); iconfig config = source.addconfig("general"); config.set("debug", "false"); config.set("logging", "on"); config = source.addconfig("logging"); config.set("filepath", "c:\\temp\\myapp.log"); source.save("myapp.ini");
5.5为您的应用程序选择正确的配置文件类型
nini的编写旨在使所有配置文件类型都成为一流公民。这是因为每种配置文件类型都有其自身的优点和缺点。下面的列表包含一些基本准则:
ini
- 速度-文件类型的解析速度非常快,因此它的加载和保存速度可能比其他类型更快。
- 可读性-在配置类型中,这可能对用户最不可怕。如果您要让用户手动更改此配置文件,那么我强烈建议您使用此格式。
- 安装程序-ini文件受许多类型的安装程序支持(wise,nsis,仅举几例)。如果您需要构建来编辑这些文件,那么绝对可以这样做。
xml
- 速度-xml解析器要加载很多信息,因此这可能是最慢的。
- 可读性-这种格式对于初学者来说有点吓人。
- 支持-所有编程语言都支持此功能,因此,如果其他应用程序正在访问数据,那么这是一个很好的类型。
- 安装程序-由于配置文件没有标准的xml格式,因此安装程序通常不支持此格式。
.net配置文件
- 速度-xml解析器要加载很多信息,因此这可能是最慢的。
- 可读性-这种格式对于初学者来说有点吓人。
- 安装程序-.net framework将这些配置文件用于其他配置。如果将.net配置和您自己的应用程序配置选项混合使用,我建议不要使用它。
windows注册表
- 速度-快速检索配置数据。随着注册表越来越多地填充数据,检索速度的确会变慢。这被认为是定期重新安装windows可以使计算机运行更快的原因之一。
- 可读性-如果您确实不希望用户能够配置应用程序,则应使用此类型。触摸注册表可能会导致严重问题,因此建议除非必要,否则不要使用它。但是,请注意,如果您的支持人员需要用户调整配置设置,他们将遇到与用户相同的问题。除此之外,配置文件编辑器是众所周知的并且很成熟。
-
安装程序-大多数安装程序支持读取和编辑注册表项,因此这是一个不错的选择。
没有完美的配置类型,因为每个配置都有自己的优势。如果最终选择的配置文件类型不适合您的情况,则不要惊慌。nini提取了您要访问的文件类型,因此您必须更改的代码量应该最少。
本教程就是这样。希望对您有所帮助!如果您有任何关于改进本手册的问题或建议,请访问nini主页,并使用论坛,错误跟踪器或功能请求工具来表达自己的意见。
附件:获取nini
上一篇: 使用.Net Core CLI命令dotnet new创建自定义模板
下一篇: JAVA IO