这个错误是我在打包的时候,发现的,因为我移动了我的工程的位置(从C盘移动到了D盘),看一下出错的代码:
Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DBUser") '这里修改配置文件就可以确定是查询那个表了。
'/// <summary>
'/// depiction:<实例化一个DAL中的User表的类>
'/// </summary>
'/// <param name="<参数名称>"><参数说明></param>
'/// <returns>
'///<返回值是一个boolean值>
'/// </returns>
Public Function CreateUserInfo() As IDAL.IUser
Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strDB), IUser)
End Function
上面strDB的值是从配置文件中取出来的,个人认为,仅仅个人认为配置文件就是一个变量库,而不把这个变量写在代码中是因为配置文件是在系统运行的时候,就会将里面的值加载出来。
首先利用这次机会,我想说说我对反射的理解:
我们使用反射,首先要清楚命名空间中几个类的关系:
System.Reflection 命名空间
(1)AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器
(2)Assembly:程序集类
(3) Module:模块类
(4)Type:使用反射得到类型信息的最核心的类
他们之间是AppDomain可以包含多个Assembly,一个Assembly可以包含多个Module,一个Module可以包含多个Type.
在我们设计的机房收费系统中,上面的代码就是我们动态加载一个程序集(Assembly),动态加载程序集的方法可以使用三种:Load,LoadFrom和LoadWithPartialName三个Assembly的静态方法。
显然我们用的是第一种。Assembly.Load(),这个方法加载程序集的顺序是:首先它回去全局程序集缓存查找,再到应用程序的根目录查找,最后在应用程序的私有路径中查找。
Assembly.Load("")的使用说明如下;
并不是命名空间。常用的是程序集名称,也就是dll的名称
重载列表
名称 说明
Assembly.Load (AssemblyName) 在给定程序集的 AssemblyName 的情况下,加载程序集。
关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")
而不管在哪一层写这段代码其中的("程序集")读取的实际是web层bin文件夹下的dll,也就是说你反射的类的程序集dll在web层的bin下必须有。
Assembly.Load("程序集名")
在看我们的代码:程序集名为"DAL"(DAL为我的D层的文件包),直接上图大家看的更清楚:
大家可以看到在我的UI层(Web层)根本就没有DAL.dll文件,有的话按照字母排列应该在红线处,所以,我们就到DAL层(DAL\bin\release)将DAL.dll相关文件拷到Web层,结果:
好的,运行一下就好了。