我可以将 Ini 文件存储在资源文件中吗?

Can I store an Ini file in a Resources file?

我有一个 Windows Forms 应用程序,.Net Framework 4.6.1,我想将一些数据库连接数据存储在一个 Ini 文件中。

然后我想将它存储在项目的资源文件中(这样我就不必手动 copy/paste Debug 和 Release 文件夹中的文件等)作为普通文件,但是当我尝试编译程序并使用 ini-parser 读取 Ini 数据时,出现以下异常:System.ArgumentException: 'Invalid characters in path access'.

我使用的是Properties.Resources读取Ini文件的地方,所以我猜路径应该没有问题。会不会是ini文件本身的问题?

Ini文件内容如下:

[Db]
host = (anIP)
port = (aPort)
db = (aDbName)
user = (aDbUser)
password = (aDbUserPwd)

以及我读取数据的方法:

public static void ParseIniData()
{
    var parser = new FileIniDataParser();
    IniData data = parser.ReadFile(Properties.Resources.dbc);

    mysqlHost = data["Db"]["host"];
    mysqlPort = data["Db"]["port"];
    mysqlDb = data["Db"]["db"];
    mysqlUser = data["Db"]["user"];
    mysqlPwd = data["Db"]["password"];
}

我终于可以使用@KlausGütter 在评论中告诉我的内容来做到这一点(谢谢!)。

您必须使用 StreamIniDataParser 而不是使用 FileIniDataParser,并使用 Assembly.GetManifestResourceStream 获取流。

我发现这有点棘手,因为使用这种方法需要将要读取的文件中的Build Action设置为Embedded Resource。 然后在编译时将此文件添加为嵌入式资源,您可以检索其流。

所以我的方法是这样结束的:

public static void ParseIniData()
{
    var parser = new StreamIniDataParser();
    dbcReader = new StreamReader(_Assembly.GetManifestResourceStream("NewsEditor.Resources.dbc.ini"));

    IniData data = parser.ReadData(dbcReader);

    mysqlHost = data["Db"]["host"];
    mysqlPort = data["Db"]["port"];
    mysqlDb = data["Db"]["db"];
    mysqlUser = data["Db"]["user"];
    mysqlPwd = data["Db"]["password"];
}

其中 _Assembly 是私有静态属性:private static Assembly _Assembly = Assembly.GetExecutingAssembly();。这会让你得到当 运行 代码时正在执行的程序集(你也可以直接在方法中使用这段代码,但我在 class 中的另一个方法上使用了程序集,所以我决定设置一个属性...我猜是干的)。