从类库项目中的 App.config 中读取

Posted

技术标签:

【中文标题】从类库项目中的 App.config 中读取【英文标题】:Read from App.config in a Class Library project 【发布时间】:2012-04-09 22:42:23 【问题描述】:

我正在开发一个简单的类库项目,它会给我一个 dll。

我想从配置文件中读取一个特定的值。所以我在我的项目中添加了一个 App.config 文件。

 <?xml version="1.0" encoding="utf-8" ?>
 <configuration>

  <appSettings>
  <add key="serviceUrl" value="test value" />
  </appSettings>

  </configuration>

上面是我的 App.config 文件,现在我尝试如下读取它

  string strVal = System.Configuration.ConfigurationManager.AppSettings["serviceUrl"];

但我的字符串变量中没有任何值。

我以类似的方式为 Web 应用程序完成了此操作,并且成功了。 但不知何故,我无法让这个工作。

首先在类库项目中包含 App.config 的想法是否正确?

【问题讨论】:

您有多个 App.config 文件吗?尝试调试并查看 ConfigurationManager.AppSettings 中的密钥计数,如果显示为 0,我会假设 VS 未检测到您的应用配置文件。 我只有一个 app.config,并且附上了我的调试屏幕截图 将应用配置文件添加到主项目中,而不是在类库程序集中。 要检查这个我正在做的是...我创建了一个测试项目,我正在调用在这个类库中创建的一个类中定义的公共方法之一。这个类库项目有一个 app.config。 我的解决方案中有两个项目 1. 类库 2. 测试项目在哪里添加? 【参考方案1】:

如我评论中所述,将 App.Config 文件添加到主解决方案而不是类库项目中。

【讨论】:

我的解决方案中有两个项目 1. 类库 2. 测试项目我在哪里添加它? 找到了!感谢 Darren,我尝试将 app.config 添加到我的测试项目中,当我输入 ConfigurationManager.AppSetting ...类项目我回去删除了 4.0 引用并添加了 2.0 一个,现在它可以工作了!!【参考方案2】:

您不需要添加 app.config 文件。 如果您为基于 Web 的应用程序创建类库,那么您可以获取连接 直接来自 web.config 文件的字符串

您可以添加任何带有连接字符串的文本文件并获取该字符串。 使用这个

public static ConnectionStringSettings ConnSettings

    get
    
        string connectionStringKey = null;
        connectionStringKey = ConfigurationManager.AppSettings.Get("DefaultConnectionString");
        return ConfigurationManager.ConnectionStrings[connectionStringKey];          
    

【讨论】:

【参考方案3】:

假设问题是要求特定于 dll 项目的配置文件,而不是应用程序或 Web 应用程序项目的配置文件,我使用以下代码从“sqlSection”部分中的键获取值。 (需要注意的是,这个配置文件——即使它被设置为始终复制——也不会自动复制到 web 应用程序的部分构建中。所以我使用了令人敬畏的单行预构建操作来复制文件,因为在这篇文章中提到了https://***.com/a/40158880/1935056)。

这里是整个 dll 配置文件

<?xml version="1.0" encoding="utf-8" ?>


<sqlSection>

<add key="sql1" value="--statement--"/>
</sqlSection>

这是 C# 代码。

 string GetSqlStatement(string key)
    
            string path =   Path.GetDirectoryName(Assembly.GetCallingAssembly().CodeBase) + @"\DataLayer.dll.config";

        XDocument doc = XDocument.Load(path);

        var query = doc.Descendants("sqlSection").Nodes().Cast<XElement>().Where(x => x.Attribute("key").Value.ToString() == key).FirstOrDefault();

        if (query != null)
        
            return query.Attribute("value").Value.ToString();
        

【讨论】:

【参考方案4】:

我的代码读取配置文件

Int32 FilesCountLimit = Convert.ToInt32(ConfigurationManager.AppSettings["FilesTotalCount"]);
    long FilesLengthLimit = Convert.ToInt64(ConfigurationManager.AppSettings["FilesTotalSize"]);

我的 app.config 文件示例

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="FilesTotalCount" value="1000" />
    <add key="FilesTotalSize" value="500000000" />
  </appSettings>
</configuration>

如果您的解决方案列出了多个项目,请确保应用设置在启动项目中,否则您将得到 null 作为答案。

【讨论】:

【参考方案5】:

从类库项目中的可执行文件访问 App.Config。

项目1:示例(可执行项目.exe)

项目2:Sample.Database(类库项目.dll)

项目 1 包含 app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
  <connectionStrings>
    <clear />
    <add name="Connection_Local" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\work\WF\ScaleCalibration\ScaleCalibration\AppData\db_local.mdf;Integrated Security=True;Connect Timeout=30" />
  </connectionStrings>>
</configuration>

项目 2 需要访问配置设置...创建以下类:

public class AssemblyConfiguration : MarshalByRefObject

    public static string GetConnectionString(string name)
    
        Assembly callingAssembly = Assembly.GetEntryAssembly();
        var conStringCollection = ConfigurationManager.OpenExeConfiguration(callingAssembly.Location).ConnectionStrings;
        return conStringCollection?.ConnectionStrings[name].ConnectionString;
    

dll 项目中的静态类:

public static class DBConnection

    public static string ConnectionStringLocal => AssemblyConfiguration.GetConnectionString("Connection_Local");

在类库项目中的任何地方使用:

var xx = DBConnection.ConnectionStringLocal;

如果不想每次函数调用都读取Connection String,可以在DBConnection中创建一个成员变量,为null时设置,否则返回。

【讨论】:

【参考方案6】:

已解决

我遇到过这个问题。我所做的如下。

这就是代码的样子

    App.config

    来自类库

【讨论】:

以上是关于从类库项目中的 App.config 中读取的主要内容,如果未能解决你的问题,请参考以下文章

从类库转换为 WCF 需要采取哪些步骤?

.NET 类库项目中的多个 App.Config 文件

使用类库从 web.config/app.config 获取配置设置

类库的 app.config 中的绑定重定向有啥作用吗?

从 .NET 中的 app.config 或 web.config 读取设置

加载了错误的 App.config