初学抽象工厂,碰到Type.GetType返回null问题 本帖最后由 postcha 于 2014-06-18 18:18:19 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 重新写了一遍,结果报的找不到程序集。代码如下,用VS2013打开。http://www.postcha.com/testabc.zip 是不是应该这样呢? //加载程序集 Assembly asm = System.Reflection.Assembly.Load(configName); //得到一个类型 Type type = asm.GetType(className); 还是一样。如果我用简单工厂,直接返回一个new App_dal();的话,正常,说明其它地方没有错。就是工厂里的private static Type GetIn(string name)有问题。但是问题又找不出。我的环境是windows 8.1 x64 + .NET 4.5/4.5.1+VS2013 UPDATE 1/UPDATE 2都试了,结果都一样。没有其它环境了,没法试。 Type[] types = Type.GetTypes();foreach (var item in types){ 输出(item.Name);}用这个代码输出全部的Type,看看有没有“className”。 还是一样。如果我用简单工厂,直接返回一个new App_dal();的话,正常,说明其它地方没有错。就是工厂里的private static Type GetIn(string name)有问题。但是问题又找不出。你可以把 asm.GetTypes() 全都打印出来,看看你的className中的值有什么问题。通常是忘记了在类型前边写上命名空间。 如果是我,我会把所有引用都添加一遍,或者是把该有的需要调用的程序集都拷贝到bin目录下 请尝试以下代码 public static IDAL.IUser GetUserDAL() { //配置文件中的程序集名称和命名空间 string configName = ConfigurationManager.AppSettings["DataAccess"]; //得到全类名 string className = configName + ".UserDal"; //加载程序集 System.Reflection.Assembly.LoadFile( Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin", configName + ".dll")); string n = typeof(UserDal).AssemblyQualifiedName; Type type = Type.GetType(className + ", " + configName); IDAL.IUser dal = Activator.CreateInstance(type) as IDAL.IUser; return dal; }另外要把MY.DAL.dll放到.\web\bin里面。LoadFile需要指定绝对路径。建议把configName改名为assemblyName。以上代码在我的电脑运行通过。 如何解决网站会员和论坛会员同步 未能加载类型“WebApp.Global”错误 ASP.NET程序发布到IIS上不能正常运行的问题? 急!!在线等 关于重写webpart相关类整合自定义用户数据的问题 再问: 数据库不能更新问题??(在线等待) 请教javascript问题,加急! oracle数据库连接问题 简单问题回答有分 asp.net中怎么弹出新的窗口? “syhy_deploy.wdproj”-- 失败 怎样用JS来实现分页? asp.net网站第一次访问时总是出现超时问题
代码如下,用VS2013打开。
http://www.postcha.com/testabc.zip
Assembly asm = System.Reflection.Assembly.Load(configName);
//得到一个类型
Type type = asm.GetType(className);
如果我用简单工厂,直接返回一个new App_dal();的话,正常,说明其它地方没有错。就是工厂里的private static Type GetIn(string name)有问题。但是问题又找不出。我的环境是windows 8.1 x64 + .NET 4.5/4.5.1+VS2013 UPDATE 1/UPDATE 2都试了,结果都一样。没有其它环境了,没法试。
foreach (var item in types)
{
输出(item.Name);
}
用这个代码输出全部的Type,看看有没有“className”。
如果我用简单工厂,直接返回一个new App_dal();的话,正常,说明其它地方没有错。就是工厂里的private static Type GetIn(string name)有问题。但是问题又找不出。
你可以把 asm.GetTypes() 全都打印出来,看看你的className中的值有什么问题。通常是忘记了在类型前边写上命名空间。
{
//配置文件中的程序集名称和命名空间
string configName = ConfigurationManager.AppSettings["DataAccess"];
//得到全类名
string className = configName + ".UserDal";
//加载程序集
System.Reflection.Assembly.LoadFile(
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin", configName + ".dll")); string n = typeof(UserDal).AssemblyQualifiedName; Type type = Type.GetType(className + ", " + configName);
IDAL.IUser dal = Activator.CreateInstance(type) as IDAL.IUser;
return dal;
}另外要把MY.DAL.dll放到.\web\bin里面。LoadFile需要指定绝对路径。建议把configName改名为assemblyName。以上代码在我的电脑运行通过。