程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 使用C#的反射機制時遇到的問題

使用C#的反射機制時遇到的問題

編輯:C#基礎知識
  項目DALFactory是采用工廠模式設計的,設計模式的書我也曾看過java的設計模式,理解也不太深刻,但對工廠模式還是較為熟悉,使用它可以根據需求返回不同的實例對象,在DALFactory項目中使用反射機制來實現依賴注入,當然,它的實現還是沒有java中的spring那樣靈活,強大,部分代碼如下:

// <summary>
/// 抽象工廠模式創建DAL。
/// web.config 需要加入配置:(利用工廠模式+反射機制+緩存機制,實現動態創建不同的數據層對象接口)
/// DataCache類在導出代碼的文件夾裡
/// 可以把所有DAL類的創建放在這個DataAccess類裡
/// <appSettings>
/// <add key="DAL" value="SmsSystem.SQLServerDAL" /> (這裡的命名空間根據實際情況更改為自己項目的命名空間)
/// </appSettings>
/// </summary>
public sealed class DataAccess
{
private static readonly string path = ConfigurationManager.AppSettings["DAL"];
/// <summary>
/// 創建對象或從緩存獲取
/// </summary>
public static object CreateObject(string path, string CacheKey)
{
 object objType = DataCache.GetCache(CacheKey);//從緩存讀取
 if (objType == null)
 {
  try
  {
   //Assembly ass = new Assembly();
   objType = Assembly.Load(path).CreateInstance(CacheKey);//反射創建
   DataCache.SetCache(CacheKey, objType);// 寫入緩存
  }
  catch(System.Exception ex)
  {
   string str = ex.Message;//
   SmsSystem.Utility.SaveLog.SaveInfoToLog(str, "errorLog", "異常");
  }
 }
 return objType;
}
/// <summary>
/// 不使用緩存,創建對象
/// </summary>
private static object CreateObjectNoCache(string path, string CacheKey)
{
 try
 {
  object objType = Assembly.Load(path).CreateInstance(CacheKey);
  return objType;
 }
 catch//(System.Exception ex)
 {
  //string str=ex.Message;// 記錄錯誤日志
  return null;
 }
}
/// <summary>
/// 創建CustEmployee數據層接口
/// </summary>
public static SmsSystem.IDAL.ICustEmployee CreateCustEmployee()
{
 string CacheKey = path + ".CustEmployee";
 object objType = CreateObject(path, CacheKey);
 return (ICustEmployee)objType;
}
………………(其它數據層接口)
}
  由這一個類,就可以獲取需要用的數據訪問層的實例,可是,我在使用過程中卻總是拋出異常,[System.IO.FileNotFoundException] = {"未能加載文件或程序集“SmsSystem.SQLServerDAL”或它的某一個依賴項。系統找不到指定的文件。":"SmsSystem.SQLServerDAL"} ,說實話,對於C#這排錯和調試我還手生,我百思不得其解,為什麼會一用反射就異常呢,整個上去我去看反射的IPA,感覺我的用法沒錯誤啊,況且,我看PetShop的例子就是這樣差不多的寫法,它為什麼能用,下午調試了好久還是在出錯,我發狠心去和petShop去對比,後來終於發現,它的dll的名字有些怪,和我的不同,它的都是如PetShop.SQLServerDAL.dll這樣的名字,而我的就是個SQLServerDAL.dll,我感覺極有可能是這裡有問題,因為在wb.config裡我配置過

<appSettings>
<add key="DAL" value="SmsSystem.SQLServerDAL"/>
…………
</appSettings>
  這樣一個程序集,搞了好久,請教別人,結果弄清楚,是要項目的屬性裡設置程序集的名稱,就可以生成SmsSystem.SQLServerDAL.dll這樣的dll文件


  設置,重新生成 ,又出了一點問題,

  類型“SmsSystem.BLL.CustEmployee”同時存在於“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files
\smssystem\3358d7f2\16ba9bb7\assembly\dl3\7296d5df\40ded961_96d8c601\BLL.DLL”
和“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\smssystem\3358d7f2
\16ba9bb7\assembly\dl3\644d894c\4cf8840a_9ad8c601\SmsSystem.BLL.DLL”
中 G:\ASP.NET\SmsSystem\Default.aspx.cs 22

  我仔細一看,原來在web項目的bin下面,原來的SQLServerDAL.dll還在,又多了個SmsSystem.SQLServerDAL.dll,哈哈,vs2005又一個沒有自動刪除掉的多余文件,昨天是一個項目文件AssemblyInfo.cs刪除掉後,在相應的刪除文件竟然沒刪除,不過,我把它手工刪除掉,OK,一切正常,還是感謝告訴我怎麼樣改項目的Assembly name的朋友,不然我竟然找好久也不曉得怎麼生成帶上命名空間的dll。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved