2009-09-28 18 views
0

有兩個項目:一個是類庫(.dll程序集),另一個是使用類庫的GUI(.exe)。從類庫中使用多個.settings類,如何繼續?

在類庫中,我使用所有「應用程序」設置添加了兩個.settings文件(它會自動將app.config文件添加到項目中)。當我編譯項目時,我有效地獲取了輸出目錄中的MyLib.dll.config文件。

現在,對於GUI項目,我引用類庫並手動將MyLib.dll.config複製到bin \ debug(和release)文件夾。

我想從GUI應用程序中獲取MyLib.dll.config設置,但到目前爲止它不工作。我試過將.settings類設置爲公開,但我沒有成功。

我讀過關於OpenMappedExeConfiguration()方法,但我似乎無法找到返回的配置中的設置。此外,我將如何強制.settings類使用OpenMappedExeConfiguration返回的配置?

注意:我不想手動將MyLib.dll.config中的條目添加到GUI應用程序的app.config中,因爲這些條目根本不屬於那裏。


其他注意事項:

,我已經是config文件:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="TestAssembly.ItemClass" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
      <section name="TestAssembly.Entity" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <applicationSettings> 
     <TestAssembly.ItemClass> 
      <setting name="Job" serializeAs="String"> 
       <value>TrussPlant.Job</value> 
      </setting> 
      <setting name="Family" serializeAs="String"> 
       <value>TrussPlant.Family</value> 
      </setting> 
     </TestAssembly.ItemClass> 
     <TestAssembly.Entity> 
      <setting name="TrussClassifier" serializeAs="String"> 
       <value>TrussPlant.Classifier</value> 
      </setting> 
      <setting name="TrussComposer" serializeAs="String"> 
       <value>TrussPlant.Composer</value> 
      </setting> 
     </TestAssembly.Entity> 
    </applicationSettings> 
</configuration> 

注意,有一個SectionGroup其中包含了兩個部分。

回答

1

假設你的DLL項目有這樣的事情在\屬性\ Settings.Designer.cs:

namespace _SampleApplication.Properties { 
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] 
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 
... 

然後,你可以在此用下面的代碼您的DLL項目添加到另一個文件

namespace _SampleApplication.Properties { 
    partial class Settings 
    { 
     static System.Configuration.Configuration _config = null; 

     private System.Configuration.Configuration DllConfig 
     { 
      get 
      { 
       return _config != null ? _config : 
        _config = System.Configuration.ConfigurationManager.OpenExeConfiguration(this.GetType().Assembly.Location); 
      } 
     } 

     public override object this[string propertyName] 
     { 
      get { return DllConfig.AppSettings.Settings[propertyName].Value; } 
      set { DllConfig.AppSettings.Settings[propertyName].Value = value as string; } 
     } 
    } 
} 

更多的'黑客'解決方案,我不知道如何做對,但它會工作。

+0

好主意,但似乎是DllConfig.AppSettings [propertyName]錯誤,因爲編譯器不允許它。我嘗試了DllConfig.AppSettings.Settings,但仍然無法正常工作。我甚至試圖使用DllConfig.AppSettings.Properties,但它被聲明爲受保護的內部... – 2009-09-28 19:44:40

+0

對不起,我已經更新了這個[字符串]實現,以實際編譯,但它仍然未經測試,因爲這樣...但*應*工作。 – 2009-09-29 16:41:27

0

一般來說,配置設置應屬於應用程序,而不屬於組件。

也就是說,組件應該能夠讀取自己的設置,因此可以向組件添加一個方法來讀取設置,然後從應用程序中調用該方法。