DLL的App.config
我们有一个"引擎",可以动态加载dll(无论位于某个目录中),并通过反射方式从中调用Workflow类。
现在,我们有了一些需要访问数据库的新工作流程,因此我想将配置文件放在dll目录中。
但是由于某种原因,我的工作流程只是看不到配置文件。
<configuration> <appSettings> <add key="ConnectString" value="Data Source=officeserver;Database=mydatabase;User ID=officeuser;Password=officeuser;" /> </appSettings> </configuration>
给定上述配置文件,以下代码将输出一个空字符串:
Console.WriteLine(ConfigurationManager.AppSettings["ConnectString"]);
我想我想要的只是指定一个配置文件名,但是我在这里遇到了问题。我只是没有得到结果。
有人有指针吗?
解决方案
有趣的是,我正在做的事情非常相似,并且配置文件可以很好地加载。在我们的例子中,我认为每个新的配置文件的名称都与其关联的程序集的名称匹配。因此,MyLibrary.dll将具有一个名为MyLibrary.dll.config的文件,其中包含该文件程序集的信息。另外,我方便使用的示例是使用VB.Net而不是C(每个都有),并且其中的所有设置都是针对VB特定的My.Settings命名空间的,因此我们不直接使用ConfigurationManager类来阅读它们。
设置本身如下所示:
<applicationSettings> <MyLibrary.My.MySettings> <setting name="SomeSetting" serializeAs="String"> <value>12345</value> </setting> </MyLibrary.My.MySettings> </applicationSettings>
如果我没记错的话,将从应用程序目录中加载app.config,因此,如果我们从其他目录中加载dll,则需要在应用程序的配置文件中使用它们所需的密钥。
如果DLL中包含用于读取AppSettings的代码示例,则它将尝试读取该应用程序的配置文件,而不是DLL的配置文件。这是因为我们正在使用反射执行代码。
我不太确定,但我认为默认情况下该类仅适用于AppDomain的entry方法的路径(大多数情况下exe的路径)。
我们需要先调用OpenExeConfiguration(string exePath)(Framework 2.0及更高版本)以指向其他配置文件。
我是为类似的系统编写的。我的回忆是,我使用Assembly.GetExecutingAssembly获取DLL的文件路径,将.config添加到该名称后,以XmlDocument的形式加载,导航到<appSettings>节点,并将其传递给NameValueSectionHandler`的Create方法。