工厂模式的Assembly.Load(path).CreateInstance(className)出错解决方法
来源:互联网 发布:淘宝行业关键词转化率 编辑:程序博客网 时间:2024/04/30 12:38
1、问题描述
★代码展示
下面是Factory中的一段代码:
'**********************************************' 文 件 名:DataAcess' 命名空间:Factory' 内 容:' 功 能:创建用户需要的接口' 文件关系:' 作 者:令仔很忙' 小 组:' 生成日期:2014-07-28 17:37:52' 版 本 号:V2.0' 修改日志:' 版权说明:'**********************************************Imports System.Reflection '引用 反射 命名空间Imports System .Configuration Public Class DataAcess Private Shared ReadOnly assemblyName As String = "DAL" '数据程序集名称 Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DB") ''' <summary> ''' 创建用户接口 ''' </summary> ''' <returns>返回IUser</returns> ''' <remarks></remarks> Public Function CreateIUser() As IDAL.IUser Dim className As String = assemblyName + "." + strDB + "UserDAL" '定义 命名空间.类<pre name="code" class="vb"><span style="white-space:pre"></span>Return CType(Assembly.Load(assemblyName).CreateInstance(className), IDAL.IUser) ’容易出错不易理解的地方
在这段代码中,下面这一语句是不易理解,容易出错的地方
Return CType(Assembly.Load(assemblyName).CreateInstance(className), IDAL.IUser)
★相关知识了解
下面咱们先了解Assembly.Load(path).CreateInstance(className)
在VB.NET中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:
System.Reflection命名空间
(1) AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器
(2) Assembly:程序集类
(3) Module:模块类
(4) Type:使用反射得到类型信息的最核心的类
他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type.
在上面的语句中我们用到的是Assembly这一类,在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是Load,LoadFrom和LoadWithPartialName三个Assembly的静态方法.我们主要说Load方法:
Assembly.Load("")的使用说明如下;
并不是命名空间。常用的是程序集名称,也就是dll的名称
重载列表
名称说明
Assembly.Load(AssemblyName)在给定程序集的AssemblyName的情况下,加载程序集。
2、 出现的问题及解决方法
★未能加载文件或程序集“DAL”或它的某一个依赖项,系统找不到指定文件
关于反射Assembly.Load("程序集").CreateInstance("命名空间.类"),而不管在哪一层写这段代码其中的("程序集")读取的实际是web层bin文件夹下的dll,也就是说你反射的类的程序集dll在web层的bin下必须有。
注意CreateInstance()一定是命名空间.类名,否则创建的实例为空
Assembly.Load("程序集名")
出现这样的错误有三种可能:
1)、DLL文件名与加载时的DLL文件名不一致。
2)、.DLL文件根本不存在,即出现丢失情况。
3)、加载DLL路径错误,即DLL文件存在,但加载路径不正确
看了下自己的问题,主要就是上面的第三种情况,加载路径不正确,怎么解决?
找到文件夹DAL/bin/Debug,将里面与DAL相关的文件复制到UI/bin/Debug中去,运行,就可以了,后期的工作,如果每次遇到这中情况都手动添加的话会很麻烦,所以我们需要更改程序的生成路径:
★未将对象引用设置到对象的实例
上面的语句中的CreateInstance(className),中className其实是需要反射的类型全名(包括命名空间的全路径),如下图:最终className返回的结果是DAL.SqlUserDAL
它是和DAL层相对应的,所以DAL层下的类的命名必须和它保持一致
其实这个问题有很多种情况,这只是其中的一种出错的地方和解决方法。
3、结束语
机房收费系统重构,刚开始开始敲三层或者开始敲七层,都是一段困难的过程,但是在这个过程中也是你进步最大的,不会了,多看看其他人的博客,多问,不理解可以先把别人的拿过来用,鲁迅先生在《拿来主义》中说过一句话:“有选择的拿,为我所用的拿,不卑不亢的拿”。借鉴是豁然开朗,是一种共鸣,为我所用,有更上一层楼的感觉;照抄是模仿,但走不出去,就会失去自我,如果说有临界点的话,那就是我说我的话,用自己的话别人能听懂而已。
- 工厂模式的Assembly.Load(path).CreateInstance(className)出错解决方法
- 工厂模式 Assembly.Load(path).CreateInstance 出错解决方法
- 工厂模式生成构造函数带参数的对象时的解决办法(Assembly.Load(path).CreateInstance)
- 关于Assembly.Load(path).CreateInstance
- C#反射中Assembly.Load及Assembly.Load.CreateInstance 方法
- c#的Assembly.Load.CreateInstance(反射)和.config的使用
- 关于Assembly.CreateInstance()与Activator.CreateInstance()方法的区别
- 关于Assembly.CreateInstance()与Activator.CreateInstance()方法的区别
- 关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")
- 关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")
- C#反射中Assembly.Load及Assembly.Load.CreateInstance方法介绍
- C#反射中Assembly.Load及Assembly.Load.CreateInstance方法介绍
- C#反射之一(Assembly.Load及Assembly.Load.CreateInstance方法介绍)
- C#反射中Assembly.Load及Assembly.Load.CreateInstance方法介绍
- C#反射中Assembly.Load及Assembly.Load.CreateInstance方法介绍
- C#反射中Assembly.Load及Assembly.Load.CreateInstance方法介绍
- C#反射之一(Assembly.Load及Assembly.Load.CreateInstance方法介绍)
- C#反射之一(Assembly.Load及Assembly.Load.CreateInstance方法介绍)
- mysqldump导出某个表的部分数据
- unity3d 滚动字幕
- spring 事务管理配置
- Windows下也可以使用osw追朔系统历史性能
- Rackspace 将支持更多的开源数据库
- 工厂模式的Assembly.Load(path).CreateInstance(className)出错解决方法
- 设计模式之 ----------- 迭代器模式
- 破茧成蝶1:设计流程——设计师具体做什么?
- 昂贵的聘礼(最短路)
- BZOJ 1934 善意的投票(最小割)
- POJ 2299 Ultra-QuickSort(归并排序求逆序对数)
- Java将毫秒转成时分秒,在android中常用
- 截图
- 杭电1284 钱换为3,2,1分的硬币,换取的方法有多少种类