.NET .config HELL

6 .net c# configuration app-config web-config

我有以下项目:

  1. MVC
  2. 控制台应用
  3. 类库
  4. Windows表单应用程序
  5. COM库

所有这些应用程序都需要使用单个配置文件.据我所知,当web.config用于Web项目时,app.config文件适用于Windows,控制台应用程序和类库.

需要在所有这些项目中访问相同的配置.我已经读过建议使用机器配置文件,但我们不会总是有权访问它,因此配置文件必须位于我们的解决方案中.

我不完全了解配置文件是如何构建的.目前我写了一个简单的项目,我有以下内容:

  1. 用于存储服务配置文件的类库.A试图通过反思来做到这一点.
  2. 应该从类库中读取app.config的Windows应用程序.

当我执行以下代码时,我希望得到一个包含测试值的配置文件:

_applicationSettings = ConfigurationManager.OpenExeConfiguration(
                    System.Reflection.Assembly.GetAssembly(typeof(WCSConfiguration)).Location
                    ).AppSettings;    
Run Code Online (Sandbox Code Playgroud)

我得到的是一个空的应用程序设置文件.

类库具有以下App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="TestTextKey" value="TestTextValue"/>
  </appSettings> 
</configuration>
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用.GetExecutingAssembly()方法,我希望返回当前正在执行的代码的程序集.这不起作用,而是返回了Windows应用程序的程序集.

GetAssembly(type(WCSConfiguration)) 已返回正确的程序集,但bin/debug目录中缺少配置文件.

我有一种感觉,要么我做了一些根本错误的事情,要么微软没有做到足够灵活.我也试图搜索MSDN以获得解释,但这并没有很好地记录在IMO中.

我还将COM保留为粗体,因为我不确定COM库是否可以使用任何配置文件.首先,我想让其他项目工作.

我知道这是很多信息.任何帮助都会受到高度赞赏.以前我们选择使用注册表,但事实证明这很糟糕,主要是因为在某些情况下无法访问注册表.此外,我们现在有多个版本的应用程序和分支之间的切换是一个半小时的工作:(

谢谢

编辑:

如果我将dll的配置部分添加到app.config,这意味着这些设置只能从该应用程序中获得.如果我错了,请纠正我.我提供的示例是缩小版本.总共有大约十个Windows应用程序,一个MVC项目和一系列类库,所有这些都需要使用该配置.

配置设置主要是连接字符串,不属于数据库的查找值以及其他一些小设置.此时主要关注的是连接字符串.应用程序的次要版本很少,每个版本都指向不同的数据库.

我想要摆脱这个问题是一个很好的可行解决方案,以便可以在线发布,遇到同样问题的其他人也不会花费几天的时间.

故事的故事IMO: 使用App.config和Web.config来存储您自己的配置文件的位置.

编写简单的XML序列化程序来读/写配置和DLL以提供配置.

COM对象是一个很长的故事并且使用"hack"实现,因为COM DLL中没有App.config或Web.config.

Ric*_*ard 4

注意ConfigurationManager.OpenExeConfiguration需要传递配置文件的文件名,而不是可执行文件。

您需要附加.config到可执行文件的路径。要获取 exe 程序集,请使用Assembly.GetEntryAssembly.

如果您想要在不全部位于同一 .NET 进程中的多段代码之间共享配置设置,我建议:

  • 把它们放在自己的myStuff.config
  • 在 .NET 代码中用于ConfigurationManager.OpenExeConfiguration打开和访问myStuff.config.
  • 非 .NET 代码需要使用 XML 解析器来加载和读取设置。除非您的配置结构非常复杂,否则封装起来应该不会太难。
  • 将路径放入myStuff.config每个共享 .NET 应用程序配置的应用程序的 app.config 中。(不适用于非 .NET 应用程序:取决于适用于该应用程序的内容。)

另一种方法是自定义配置部分,其中配置结构相同但设置是针对每个应用程序的。