使用C#的反射机制时遇到的问题

2016-02-19 14:11 2 1 收藏

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的使用C#的反射机制时遇到的问题懂设计的网友们快点来了解吧!

【 tulaoshi.com - 编程语言 】

项目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:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files
smssystem3358d7f216ba9bb7assemblydl37296d5df40ded961_96d8c601BLL.DLL”
和“c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Filessmssystem3358d7f2
16ba9bb7assemblydl3644d894c4cf8840a_9ad8c601SmsSystem.BLL.DLL”
中 G:ASP.NETSmsSystemDefault.aspx.cs 22

  我仔细一看,原来在web项目的bin下面,原来的SQLServerDAL.dll还在,又多了个SmsSystem.SQLServerDAL.dll,哈哈,vs2005又一个没有自动删除掉的多余文件,昨天是一个项目文件AssemblyInfo.cs删除掉后,在相应的删除文件竟然没删除,不过,我把它手工删除掉,OK,一切正常,还是感谢告诉我怎么样改项目的Assembly name的朋友,不然我竟然找好久也不晓得怎么生成带上命名空间的dll。

来源:https://www.tulaoshi.com/n/20160219/1606400.html

延伸阅读
标签: Web开发
    在C#中,程序采用了的驱动采用了事件驱动而不是原来的消息驱动,虽然.net框架提供的事件已经十分丰富,但是在以前的系统中定义了丰富的消息对系统的编程提供了方便的实现方法,因此在C#中使用消息有时候还是大大提高编程的效率的。 1 定义消息 在c#中消息需要定义成windows系统中的原始的16进制数字,比如 const in...
很多主流框架都使用了反射技术.像ssh框架都采用两种技术 xml做配置文件+反射技术. 与反射有关的类包. java.lang.reflect.*;和java.lang.Class; Java中所有类型(包括基本类型)都对应一个Class对象,这个Class就是java.lang.Class。即每一个类型,在Class中都有一个Class对象跟它对应.Class 没有公共构造方法。注意不是没有,是没有公共的. ...
标签: 相亲 女生
相亲男方目的性太强 相亲的目的本来就是为了结婚。难道是为了出来多认识朋友?大家嘴巴上说的是,相亲就当认识朋友,不成夫妻的话。也可以成为普通朋友。那么现在你回想下自己。你和以前相亲对象现在还是普通朋友的?又有几个还在继续联系的?突然有一天。你发现你男朋友和以前相亲还在微信或QQ聊天。然后他告诉你,那个是普通朋友,你信吗...
摘要:本文论述了各种模式的线程(单线程、单元线程和自由线程)以及每种模式的使用方法。同时,还提供了一个使用线程的 C# 语言代码示例,以帮助您编写使用线程的应用程序。本文还讨论了多线程代码中的一些重要问题。 简介 编写多线程 Microsoft® 消息队列 (MSMQ) 触发器应用程序向来是一件让人畏惧的事情。不过,.NET 框架...
标签: PHP
php作wap开发时遇到的问题 作者: slamdunk3 1.文件格式 首先要遇到的问题肯定是文件格式,在作 web开发时,大家都是用的html或xhtml,到了wap开发时,就得用wml了.什么是wml?大家可以去查更详细的资料,我这里只是略微的提到. 在我看来wml类似于xml,有非常严格的格式,在作wap页面时,都得用wml来作为显示. wml的语法非常简单,在用p...

经验教程

683

收藏

16
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部