为什么反射执行同一般执行的结果不一样?

mlxwl2013 2013-06-06 02:19:40
学习反射,写一个SqlHelper类,只有2个方法。
	public class SqlHelper
{
private OleDbConnection cn;
public SqlHelper()
{
cn = new OleDbConnection(ConfigurationManager.ConnectionStrings["OleDbConnectionString"].ConnectionString);
cn.Open();
}
public void Close()
{
cn.Close();
}
}

编译成SqlHelper.dll,放在f:下。
在aspx.cs中写:
		Assembly assembly = Assembly.LoadFrom(@"f:\SqlHelper.dll");
Type type = assembly.GetType("SqlHelper");
object obj = assembly.CreateInstance(type.FullName);
type.GetConstructor(Type.EmptyTypes).Invoke(obj, null);
type.GetMethod("Close").Invoke(obj, null);

现象:执行完毕后,发现Access数据库文件旁多出.ldb文件,且删不掉,说明数据连接没有关闭。
如果不用反射,就一般执行:
SqlHelper sqlHelper = new SqlHelper();
sqlHelper.Close();
则没有上述现象,数据连接总是关闭的。请解释为什么发生这种现象,明明最后执行了Close方法,数据连接却没有关闭?
...全文
81 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mlxwl2013 2013-06-06
  • 打赏
  • 举报
回复
引用 1 楼 mrlen 的回复:
Assembly assembly = Assembly.LoadFrom(@"f:\SqlHelper.dll");
Type type = assembly.GetType("SqlHelper");
object obj = assembly.CreateInstance(type.FullName);
type.GetConstructor(Type.EmptyTypes).Invoke(obj, null);
type.GetMethod("Close").Invoke(obj, null);
第一: object obj = assembly.CreateInstance(type.FullName); 已经执行一次 Open 第二: type.GetConstructor(Type.EmptyTypes).Invoke(obj, null); 执行第二次 Open 通俗的说。你只需要改成一下代码:
Assembly assembly = Assembly.LoadFrom(@"f:\SqlHelper.dll");
Type type = assembly.GetType("SqlHelper");
object obj = assembly.CreateInstance(type.FullName);
//type.GetConstructor(Type.EmptyTypes).Invoke(obj, null);
type.GetMethod("Close").Invoke(obj, null);
太对了,就是你说的那样。非常感谢!
颤菊大师 2013-06-06
  • 打赏
  • 举报
回复
Assembly assembly = Assembly.LoadFrom(@"f:\SqlHelper.dll");
Type type = assembly.GetType("SqlHelper");
object obj = assembly.CreateInstance(type.FullName);
type.GetConstructor(Type.EmptyTypes).Invoke(obj, null);
type.GetMethod("Close").Invoke(obj, null);
第一: object obj = assembly.CreateInstance(type.FullName); 已经执行一次 Open 第二: type.GetConstructor(Type.EmptyTypes).Invoke(obj, null); 执行第二次 Open 通俗的说。你只需要改成一下代码:
Assembly assembly = Assembly.LoadFrom(@"f:\SqlHelper.dll");
Type type = assembly.GetType("SqlHelper");
object obj = assembly.CreateInstance(type.FullName);
//type.GetConstructor(Type.EmptyTypes).Invoke(obj, null);
type.GetMethod("Close").Invoke(obj, null);

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧