在类库项目中从App.config读取配置

22

我正在开发一个简单的类库项目,它将为我生成一个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"];

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

enter image description here

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

在第一次将App.config放入类库项目中的想法是否正确?


1
你有多个App.config文件吗?尝试调试并查看ConfigurationManager.AppSettings中的Key计数,如果显示为0,则我会认为VS没有检测到您的应用程序配置文件。 - Darren
我有一个单一的app.config,并且我已经附上了我的调试截图。 - Yasser Shaikh
将应用程序配置文件添加到主项目中,而不是类库程序集中。 - Darren
为了检查这个,我创建了一个测试项目,并调用在这个类库中创建的类定义的公共方法之一。这个类库项目只有一个app.config。 - Yasser Shaikh
我在我的解决方案中有两个项目:
  1. 类库
  2. 测试项目
我应该把它们添加到哪里?
- Yasser Shaikh
6个回答

28

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


我在我的解决方案中有两个项目:1. 类库 2. 测试项目。我应该把它添加到哪里? - Yasser Shaikh
找到了!感谢Darren的帮助。我尝试添加app.config到我的测试项目,当我开始输入ConfigurationManager.AppSettings...时,Resharper再次提醒我选择System.Configuration版本2.0和4.0。我记得之前在我的类项目中使用4.0,于是我回去删除了4.0引用并添加了2.0的引用。现在它可以正常工作了! - Yasser Shaikh
我的主要项目只是一个测试项目,我不会发布它。因此,我想仅将相应的 app.config 文件附加到类库中。我该怎么做? - NShiva

8
您不需要添加app.config文件。如果您为基于Web的应用程序创建类库,则可以直接从web.config文件中获取连接字符串。
或者,您可以添加任何包含连接字符串的文本文件,并使用以下方法提取该字符串。
public static ConnectionStringSettings ConnSettings
{
    get
    {
        string connectionStringKey = null;
        connectionStringKey = ConfigurationManager.AppSettings.Get("DefaultConnectionString");
        return ConfigurationManager.ConnectionStrings[connectionStringKey];          
    }
}

3

已解决

我遇到了这个问题。我所做的是以下内容。

Read from App.config in a Class Library project

这是代码的样子。
  1. App.config

enter image description here

从类库中获得 enter image description here

3
假设问题是要求一个特定于dll项目的配置文件,而不是应用程序或Web应用程序项目的配置文件,我使用以下代码从“sqlSection”部分获取键值。 (需要注意的是,即使将此配置文件设置为始终复制,在Web应用程序的部分构建时也不会自动复制该配置文件。因此,我使用了令人惊叹的一行预构建操作将文件复制过去,如在此帖子中提到的https://dev59.com/OVbUa4cB1Zd3GeqPDPHl#40158880)。

这是整个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();
        }

2

我的代码读取配置文件

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作为答案。

2

如何在类库项目中访问可执行项目的App.Config文件

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

项目2:示例.数据库(类库项目.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;

如果您不想在每个函数调用中读取连接字符串,请在DBConnection中创建一个成员变量,并在其为null时设置它,否则返回它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接