2010-07-28 45 views
3

我想用反射(使用Assembly.LoadFrom方法)加載.NET程序集,並在此程序集中實例化一些類型。通過反射和訪問配置加載程序集時出現問題

這一切似乎工作正常,但我想實例化一種類型訪問程序集的配置在其類型初始值設定項:它確實ConfigurationManager.GetSection(sectionName)。程序集然後拋出一個異常,因爲找不到配置部分。

我正在加載的程序集的配置文件位於同一目錄中,並且具有標準名稱(即AssemblyName.dll.config),並且配置文件肯定有要求的部分。爲什麼找不到配置部分?加載程序集時是否需要額外加載?

回答

6

因爲正在讀取的配置文件是主機可執行文件的配置文件。例如,如果您運行的是Foo.exe的代碼,則您的配置文件應該命名爲Foo.exe.configAssemblyName.dll.config從不使用。如果您在網站上運行此應用程序,則應使用web.config

你可以嘗試使用OpenMappedExeConfiguration方法:

var configFileMap = new ExeConfigurationFileMap(); 
configFileMap.ExeConfigFilename = "AssemblyName.dll.config"; 
var section = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None).GetSection(sectionName); 
+0

好的,這是有道理的。有什麼(好)的方式,我可以使用我正在加載的程序集的配置?不知何故,也許將它合併到我的應用程序的配置..? – 2010-07-28 09:46:27

+0

是的,您可以使用OpenMappedExeConfiguration方法來指定想要打開的配置文件的位置並從中讀取值。 – 2010-07-28 09:56:13

1

以下的地圖文件,然後打開它作爲一個System.Configuration變量:

string FilePath = System.Reflection.Assembly.GetAssembly(typeof(EncryptDecryptViewModel)).Location 
FilePath += @".config";     
var ConfigFileMap = new ExeConfigurationFileMap(); 
ConfigFileMap.ExeConfigFilename = FilePath; 
Configuration LocalConfigurationManager = ConfigurationManager.OpenMappedExeConfiguration(ConfigFileMap, ConfigurationUserLevel.None); 

您現在可以檢索來自組件值配置文件與您通過配置管理器非常相似,但是您的請求必須更加明確。

當使用System.Configuration.ConfigurationManager,以下將是有效的,並返回一個值:

string s = System.Configuration.ConfigurationManager.AppSettings["SomeSetting"]; 

然而,使用(從上面的代碼)之類的正常ConfigurationManager中呼叫這樣的電話配置可變LocalConfigurationManager時如:

string s = LocalConfigurationManager.AppSettings["ConfigurationSections"]; 

當您試圖運行代碼,您會收到以下錯誤:

由於其保護級別

這「System.Configuration.ConfigurationElement.this [System.Configuration.ConfigurationProperty]」是 無法訪問是因爲在ConfigurationManager AppSettings屬性是一個NameValueCollection中。在配置變量,實際上AppSettings的是它包含的屬性所調用的設置即是如此KeyValueConfigurationCollection訪問屬性的呼叫是這樣的一個System.Configuration.AppSettingsSection:

string s = LocalConfigurationManager.AppSettings.Settings["SomeSetting"].Value; 

對於連接字符串Secion中,下面的語法將被使用

string ConnectionString = LocalConfigurationManager.ConnectionStrings.ConnectionStrings["connectionStringName"].ConnectionString;