我正在开发一个简单的类库项目,它会给我一个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的想法是否正确?
答案 0 :(得分:18)
如我的评论中所述,将App.Config文件添加到主解决方案而不是类库项目中。
答案 1 :(得分:6)
您无需添加app.config文件。 如果为基于Web的应用程序创建类库,则可以获取连接 字符串直接来自web.config文件
OR
您可以添加任何带有连接字符串的文本文件并获取该字符串。 使用这个
public static ConnectionStringSettings ConnSettings
{
get
{
string connectionStringKey = null;
connectionStringKey = ConfigurationManager.AppSettings.Get("DefaultConnectionString");
return ConfigurationManager.ConnectionStrings[connectionStringKey];
}
}
答案 2 :(得分:1)
假设问题是要求特定于dll项目的配置文件,而不是应用程序或Web应用程序项目的配置文件,我使用以下代码从&#34; sqlSection&中的键获取值#34;部分。 (需要注意的是,此配置文件 - 即使设置为始终复制 - 也不会自动复制到Web应用程序的部分版本上。所以我使用了令人敬畏的单行预构建操作来复制文件,如在这篇文章中提到https://stackoverflow.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();
}
答案 3 :(得分:1)
我的代码来读取配置文件
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作为答案。
答案 4 :(得分:1)
从“可在类库项目中执行”访问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;
如果您不想在每次函数调用时都读取连接字符串,请在DBConnection中创建一个成员变量,并将其设置为null,否则将其返回。
答案 5 :(得分:0)