程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#項目中關於多個程序集下App.config文件的問題

C#項目中關於多個程序集下App.config文件的問題

編輯:C#入門知識

在項目中我們會經常用到App.config文件,有的是自動生成的,比如引用webservice、wcf服務時生成;也有手動建立的配置文件直接默認名就為app.config。 這些配置有的保存當前程序集用到的一些可供外部改動的變量,比如:   [csharp]   <configuration>     <appSettings>       <add key="keyName" value="value"/>     </appSettings>   </configuration>     <configuration>   <appSettings>     <add key="keyName" value="value"/>   </appSettings> </configuration>這種的配置直接使用 ConfigurationManager.AppSettings["key名"]來讀取比較方便。例如:   [csharp]  public class ReadConfig   {       public static string ConfigKeyValue       {           string config = ConfigurationManager.AppSettings["ConfigKeyValue"];              config = string.IsNullOrEmpty(config) ? "空字符串" : config;              return config;       }   }         public class ReadConfig     {         public static string ConfigKeyValue         {             string config = ConfigurationManager.AppSettings["ConfigKeyValue"];               config = string.IsNullOrEmpty(config) ? "空字符串" : config;               return config;         }     }有表示數據庫連接的比如ADO.NET Entity連接數據時會生成配置。   [csharp]  <?xml version="1.0" encoding="utf-8"?>   <configuration>     <startup>       <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />     </startup>     <connectionStrings>       <add name="OracleEntities" connectionString="" />     </connectionStrings>   </configuration>     <?xml version="1.0" encoding="utf-8"?> <configuration>   <startup>     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />   </startup>   <connectionStrings>     <add name="OracleEntities" connectionString="" />   </connectionStrings> </configuration>有Microsoft.Practices.EnterpriseLibrary連接數據庫的配置 (http://blog.csdn.net/yysyangyangyangshan/article/details/8488791)。 再有 ”混合模式程序集是針對“v2.0.50727”版的運行時生成的,在沒有配置其他信息的情況下,無法在 4.0 運行“錯誤時要用的,   [csharp]   <?xml version="1.0"?>   <configuration>     <startup useLegacyV2RuntimeActivationPolicy="true">       <supportedRuntime version="v4.0" sku = ".NETFramework,Version=v4.0"/>       <supportedRuntime version="v2.0.50727"/>     </startup>   </configuration>     <?xml version="1.0"?> <configuration>   <startup useLegacyV2RuntimeActivationPolicy="true">     <supportedRuntime version="v4.0" sku = ".NETFramework,Version=v4.0"/>     <supportedRuntime version="v2.0.50727"/>   </startup> </configuration>等等,總之app.config作用很多。   但是在一個項目中很多程序集都要用到app.config該怎麼辦呢?比如如下情況: \   FouctionDll程序集中配置:   [csharp]   <?xml version="1.0" encoding="utf-8" ?>   <configuration>     <appSettings>       <add key="key1" value="你好,世界!"/>     </appSettings>   </configuration>     <?xml version="1.0" encoding="utf-8" ?> <configuration>   <appSettings>     <add key="key1" value="你好,世界!"/>   </appSettings> </configuration>主目錄TestAppConfig中的配置:   [csharp]   <?xml version="1.0" encoding="utf-8" ?>   <configuration>     <appSettings>       <add key="key2" value="Hello,world!" />     </appSettings>   </configuration>     <?xml version="1.0" encoding="utf-8" ?> <configuration>   <appSettings>     <add key="key2" value="Hello,world!" />   </appSettings> </configuration>這樣的情況下,如果主程序集需要引用FouctionDll,配置被復制過來由於配置名重復,自然會被主程序的配置覆蓋。 還有就是如果FouctionDll中要引用遠程服務,會自動生成app.config,一旦主程序引用該配置依然無法使用。 針對這樣,應該做如下解決: 1、第一種情況,每一個程序集的配置是手動增加的話,將起名字改變。讀取方式不再使用  ConfigurationManager.AppSettings["key"]來讀取,可改為:   [csharp]   public class ReadConfig      {          private static string currentConfig = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"ConfigName.config";                    /// <summary>           /// 判斷是否有人操作的間隔時間           /// </summary>           public static string ConfigKeyValue          {              get              {                  string time =GetAttributeValue(currentConfig,"ConfigKeyValue");                     if (string.IsNullOrEmpty(time))                  {                      return "180";                  }                     return time;              }          }          /// <summary>           /// 獲取配置文件的屬性           /// </summary>           /// <param name="key"></param>           /// <returns></returns>           private static string GetAttributeValue(string file, string key)          {              string value = string.Empty;                 try              {                  if (File.Exists(file))                  {                      XmlDocument xml = new XmlDocument();                         xml.Load(file);                         XmlNode xNode = xml.SelectSingleNode("//appSettings");                         XmlElement element = (XmlElement)xNode.SelectSingleNode("//add[@key='" + key + "']");                          value = element.GetAttribute("value").ToString();                  }              }              catch { }                 return value;          }      }      public class ReadConfig     {         private static string currentConfig = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"ConfigName.config";                  /// <summary>         /// 判斷是否有人操作的間隔時間         /// </summary>         public static string ConfigKeyValue         {             get             {                 string time =GetAttributeValue(currentConfig,"ConfigKeyValue");                   if (string.IsNullOrEmpty(time))                 {                     return "180";                 }                   return time;             }         }         /// <summary>         /// 獲取配置文件的屬性         /// </summary>         /// <param name="key"></param>         /// <returns></returns>         private static string GetAttributeValue(string file, string key)         {             string value = string.Empty;               try             {                 if (File.Exists(file))                 {                     XmlDocument xml = new XmlDocument();                       xml.Load(file);                       XmlNode xNode = xml.SelectSingleNode("//appSettings");                       XmlElement element = (XmlElement)xNode.SelectSingleNode("//add[@key='" + key + "']");                        value = element.GetAttribute("value").ToString();                 }             }             catch { }               return value;         }     } 這種方式的好處是讓每個程序集相對獨立,缺點是如果是自動生成的app.config則還是會有上述問題。那麼對於需要用到的名字必須是app.config的情況該如何呢? 可以使用超鏈接的方式,就是在項目中只有主程序使用app.config,其他程序集使用它的鏈接,這樣共同使用,如圖 \     讀取還是在當前目錄下使用ConfigurationManager.AppSettings["keyName"];   這種方式的好處是,可以解決了幾個程序集共用一個app.config的問題,缺點是程序集不獨立,因為引用了同一個文件,程序集在移動目錄是需要重新檢查再手動引用。 總之開發軟件第一目的是軟件功能正常,其次是我們開發時要盡可能的使自己方便,只有更方便,效率才能提高。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved