我们有一个动态加载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"]);
我认为我想要的只是指定一个配置文件名,但我在这里遇到了问题。我只是没有得到结果。 任何人有任何指针?
答案 0 :(得分:7)
如果用于读取AppSettings的代码示例位于DLL中,则它将尝试读取应用程序的配置文件,而不是DLL的配置文件。这是因为您使用Reflection来执行代码。
答案 1 :(得分:4)
有趣的是,我正在做的事情非常相似,配置文件加载得很好。在我们的例子中,我认为每个新的配置文件的名称都与它的关联程序集相匹配。所以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>
答案 2 :(得分:1)
我为类似的系统写了这个。我的回忆是,我使用Assembly.GetExecutingAssembly
来获取DLL的文件路径,将.config
附加到该名称,将其加载为XmlDocument
,导航到<appSettings>
节点,将其传递给NameValueSectionHandler
的{{1}}方法。
答案 3 :(得分:1)
这是一种方式 - AppDomain.CurrentDomain.SetData(“APP_CONFIG_FILE”,“配置文件的路径”);
在构造函数中调用。
答案 4 :(得分:0)
如果我没记错的话,app.config将从您的应用程序目录加载,因此如果您从其他目录加载dll,您将需要在应用程序的配置文件中使用所需的密钥。
答案 5 :(得分:0)
我不完全确定,但我认为该类只能默认使用AppDomain的入口方法的路径(大多数时候是exe的路径)。 您需要首先调用OpenExeConfiguration(字符串exePath)(Framework 2.0和更高版本)以指向不同的配置文件。