【问题标题】:Where are config files for class libraries physically located?类库的配置文件物理位置在哪里?
【发布时间】:2011-02-01 08:13:58
【问题描述】:

我的猜测是这个问题将属于“duh”的范畴,但是,我很困惑。

在例如 Windows 窗体应用程序中使用配置文件时,可以在 C:\Program files\CompanyName\ProductName\Application.exe.config 中找到配置文件。但是,对于我正在开发的类库,在从 Visual Studio 安装它(与另一个项目串联)后,我在安装文件夹中看不到“ClassLibrary.dll.config”文件。即使我在任何地方都看不到该文件,但从中检索数据也可以正常工作。另外,从类库中的方法运行以下代码会返回您期望的路径:C:\Program files\CompanyName\ProductName\ClassLibrary.dll.config

如果有人能阐明我在这里所缺少的东西,那真是太棒了。

public static string MyMethod()
{
Assembly assem = Assembly.GetExecutingAssembly();
Configuration config = ConfigurationManager.OpenExeConfiguration(assem.Location);

return "The assembly location was: " + assem.Location + Environment.NewLine +
"The config file path was: " + config.FilePath;

// Gives me "C:\Program files\CompanyName\ProductName\ClassLibrary.dll.config"

}

【问题讨论】:

    标签: c# app-config class-library


    【解决方案1】:

    您的默认值存储在 dll 中。

    但是假设您更改代码中的设置并保存它。下次存放在哪里?

    在 WinXP 中查看:

    C:\Documents and Settings\用户名\Local Settings\Application Data\

    或在 Windows Vista/7 中查看:

    C:\Users\用户名\AppData\Local\

    您将找到一个以您的应用程序命名的文件夹并深入到该文件夹​​,您将找到一个名为 user.config 的文件。

    例如:

    C:\Documents and Settings\用户名\Local Settings\Application Data\MyApp\myapp.exe_urlla1ii3sytrhx0adqtjnjuc24oacqpgu4\1.0.0.0\user.config

    【讨论】:

    • 好的,默认值将存储在 dll 中是有道理的。但是为什么我上面发布的代码会返回一个显然不存在的 dll.config 文件的完整路径?
    【解决方案2】:

    在类库中,app.config 文件毫无用处。应用程序设置值存储在 Settings.settings 文件中并编译到 Settings.designer.cs 文件中。

    如果您直接在 app.config 中修改应用程序设置之一的值,则不会影响运行应用程序时看到的设置值。您必须实际打开 Settings 编辑器,此时它会注意到 app.config 文件和 Settings.settings 文件之间的差异,并询问您是否希望它使用来自 app 的值更新您的 Settings.settings 文件.config.

    【讨论】:

    • 没有深入了解我为什么要做我正在做的事情的细节,就我的目的来说,它完美地工作就足够了。 :-) 我只想知道部署后文件最终会去哪里。
    • 类库的 app.config 文件在部署后通常不会去任何地方。在您的示例代码中,如果您评估调用 OpenExeConfiguration 返回的 Configuration 对象,您将看到 HasFile 属性为 false。也就是说,它告诉你没有“ClassLibrary.dll.config”这样的文件。
    • 啊啊啊啊……好吧!非常感谢你,史蒂文! HasFile 确实返回 false。 :-)
    【解决方案3】:

    您的类库将使用调用它的可执行文件的配置文件。

    【讨论】:

    • 调用它的可执行文件没有关联的配置文件。 (我创建了调用应用程序来严格测试库。)
    • 但是为什么ConfigurationManager在配置文件的名称上对他撒谎呢?引擎盖下似乎有一些诡计。
    • 您是否在 Visual Studio 调试器中运行程序?如果是这样,您的配置文件将类似于 .vshost.exe.config.
    • 不,我是从 Visual Studio 安装的,然后运行安装文件夹中的 exe。
    • 默认值被烘焙到 DLL 中。然后,如果您在代码中保存新值,它们将保存到属于 EXE 的 user.config 文件中。
    【解决方案4】:

    取决于 .NET 的版本。在 .NET 4.0 之前,类库不能使用自己的 app.config 文件,除非您执行自定义操作来读取数据。在这些情况下,您应该让类库的初始化需要所有适当的数据并将其传入从您的消费类的配置(即最终您的 winform 的 app.config 文件)。

    【讨论】:

    • 嗯...这很令人困惑,因为我使用的是 3.5 版,并且我添加了配置文件而没有任何问题。以我想要的方式和一切工作。我只是对为什么文件似乎不可见感到困惑。
    • 我敢打赌它是从你的 winform 的配置文件中获取它的值,而不是你认为的配置文件。仔细看看。
    • 正在检索并显示给我的值仅位于类库的配置文件中。我没有在这个特定的解决方案中创建任何其他配置文件。
    • @BadNinja:在您的bin 文件夹中查看配置文件,而不是在项目文件夹中。
    • 它从您的设置文件中获取默认值。在设置变量的属性编辑器中将 GenerateDefaultValueInCode 设置为 false - 这将强制它从使用应用程序的配置文件中读取它。但是,如果值类型是字符串,那么在消费应用的配置中缺少适当的部分不会引发错误,而只会设置一个空值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2015-05-25
    相关资源
    最近更新 更多