关于Assembly.Load("") 后释放加载的dll,急急急!!!

gy505539356 2011-09-06 05:23:36
我用Assembly.Load()加载了一个自动生成的dll用于反射创建对象

用完之后怎么释放这个dll,因为我在下次运行的时候要重新生成新的dll覆盖之前的,由于一直被占用导致新的dll无法生成

各位有经验的大哥哥、大姐姐有什么好的办法能帮我解决这个问题.
...全文
866 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gy505539356 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 showlin 的回复:]
程序集需要加载在域里才能动态释放
首先需要定义一个类,里面封装好方法动态加载你要加载的程序集,并调用反射
然后利用域调用这个类
然后释放域



C# code


//定义用于动态释放的类
[Serializable]
class CanUnloadClass:MarshalByRefObject
{
public void ……
[/Quote]

那个CanUnloadClass类有什么要注意的地方没,为什么我domain.CreateInstanceFromAndUnwrap("Library1.dll", "MyName.CanUnloadClass") 这个方法老返回不了东西。
gy505539356 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 showlin 的回复:]
就是程序集名称,
比如你的类是放在
Library1.dll程序集里,程序集在当前路径下,命名空间是MyName.CanUnloadClass
就写

CanUnloadClass obj = (CanUnloadClass)domain.CreateInstanceFromAndUnwrap("Library1.dll", "MyName.CanUnloadClass");

可……
[/Quote]
我在CanUnloadClass obj = (CanUnloadClass)domain.CreateInstanceFromAndUnwrap("Library1.dll", "MyName.CanUnloadClass");这个地方出异常, System.Runtime.Remoting.RemotingException: 远程处理无法在类型“System.MarshalByRefObject”上找到字段“__identity”。
在 System.Object.GetFieldInfo(String typeName, String fieldName)
在 System.Object.FieldGetter(String typeName, String fieldName, Object& val)
在 System.Object.FieldGetter(String typeName, String fieldName, Object& val)
在 System.RuntimeFieldHandle.GetValue(Object instance, RuntimeTypeHandle fieldType, RuntimeTypeHandle declaringType, Boolean& domainInitialized)
在 System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck, Boolean doCheckConsistency)
在 System.Reflection.RtFieldInfo.GetValue(Object obj)
在 Microsoft.Office.Tools.Debugger.Tools.TryCreateDebuggerItem(MemberInfo member, Object target, __Item& item)
宝_爸 2011-09-06
  • 打赏
  • 举报
回复
参考:

通过应用程序域AppDomain加载和卸载程序集
http://www.cnblogs.com/wayfarer/archive/2004/09/29/47896.html
showlin 2011-09-06
  • 打赏
  • 举报
回复
就是程序集名称,
比如你的类是放在
Library1.dll程序集里,程序集在当前路径下,命名空间是MyName.CanUnloadClass
就写

CanUnloadClass obj = (CanUnloadClass)domain.CreateInstanceFromAndUnwrap("Library1.dll", "MyName.CanUnloadClass");

可以参考msdn
gy505539356 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 showlin 的回复:]
CanUnloadClass obj = (CanUnloadClass)domain.CreateInstanceFromAndUnwrap("当前程序集路径", "加载到那个类的fullname");
[/Quote]
当前程序集路径怎么写?
gy505539356 2011-09-06
  • 打赏
  • 举报
回复
我现在要解决的问题是,怎样做可以释放掉 Assembly.Load("")加载的那个dll
gy505539356 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sp1234 的回复:]
引用楼主 gy505539356 的回复:
因为我在下次运行的时候要重新生成新的dll覆盖之前的,由于一直被占用导致新的dll无法生成


蒙谁呢?

你可以把前一个版本的dll先拷贝到windows临时文件目录里,然后使用 Assembly.LoadFile 加载进来。

.net完全可以在内存中有同一个dll的两个版本,豪不重复。比如说同样两个ABC类对象实例,可以一个是1.0……
[/Quote]

... 没蒙你
我Load那个dll后程序就一直占用着那个dll,而我的程序跑一遍是要重新生成那个dll的,生成dll的名字和目录肯定是一样的,名字一样的肯定就会去覆盖那个dll,而那个dll被占用是无法删除的(我试过手动删的)。
  • 打赏
  • 举报
回复
文件不能被覆盖的问题,不代表着不能加载同一个dll的不同版本。

实际上,就算是同一个dll,如果你分别从两个不同的地方加载进来,都同时反射出ABC对象实例,也是不同的。不信你就用 Assembly.LoadFile 两次创建 assembly,然后分别实例化同一个名称的类型的两个对象实例,结果是:这两个对象虽然其类型名完全一样,但是类型并不相等,也就是我上面说的“ABC类型不等于ABC类型”。在.net中,完全可以同时加载同一个dll多次,而从它们得到类型虽然同名、但是它们是不同的。
  • 打赏
  • 举报
回复
[Quote=引用楼主 gy505539356 的回复:]
因为我在下次运行的时候要重新生成新的dll覆盖之前的,由于一直被占用导致新的dll无法生成
[/Quote]

蒙谁呢?

你可以把前一个版本的dll先拷贝到windows临时文件目录里,然后使用 Assembly.LoadFile 加载进来。

.net完全可以在内存中有同一个dll的两个版本,豪不重复。比如说同样两个ABC类对象实例,可以一个是1.0.0.1来反射出来的的,另外一个是1.0.0.3反射出来的,好不冲突,而且这两个对象都是ABC类型,只不过ABC类型不等于ABC类型而已。
showlin 2011-09-06
  • 打赏
  • 举报
回复
程序集需要加载在域里才能动态释放
首先需要定义一个类,里面封装好方法动态加载你要加载的程序集,并调用反射
然后利用域调用这个类
然后释放域




//定义用于动态释放的类
[Serializable]
class CanUnloadClass:MarshalByRefObject
{
public void DoSomething()
{
//动态加载程序集,并调用
}
}

//调用的时候
#region 封装域,动态加载释放程序集
//创建一个域
AppDomain domain = AppDomain.CreateDomain("取个域的名字");
//利用这个域动态地加载类
CanUnloadClass obj = (CanUnloadClass)domain.CreateInstanceFromAndUnwrap("当前程序集路径", "加载到那个类的fullname");
//调用这个类,
obj.DoSomeThing();
//释放域,也就是释放了动态加载的程序集
AppDomain.Unload(domain);
#endregion


gy505539356 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 feixuyue 的回复:]
Assembl=null;
gc.collect()
[/Quote]
这个我刚刚试了,不行。
xiongxyt2 2011-09-06
  • 打赏
  • 举报
回复
feixuyue 2011-09-06
  • 打赏
  • 举报
回复
Assembl=null;
gc.collect()
gy505539356 2011-09-06
  • 打赏
  • 举报
回复
顶起来呀!!
gy505539356 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sgzhou12345 的回复:]
好像这样不行吧,可能参数有问题吧
[/Quote]
参数没问题的,可以正确反射生成对象,只是第二次运行的时候因为没有释放dll,在生成dll那里出问题了。
bios8086 2011-09-06
  • 打赏
  • 举报
回复
帮你顶起来!
山东蓝鸟贵薪 2011-09-06
  • 打赏
  • 举报
回复
好像这样不行吧,可能参数有问题吧

110,567

社区成员

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

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

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