首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于Assembly.Load("") 后释放加载的dll,解决思路

2012-04-21 
关于Assembly.Load() 后释放加载的dll,急急急!!!我用Assembly.Load()加载了一个自动生成的dll用于反射创

关于Assembly.Load("") 后释放加载的dll,急急急!!!
我用Assembly.Load()加载了一个自动生成的dll用于反射创建对象

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

各位有经验的大哥哥、大姐姐有什么好的办法能帮我解决这个问题.

[解决办法]
程序集需要加载在域里才能动态释放
首先需要定义一个类,里面封装好方法动态加载你要加载的程序集,并调用反射
然后利用域调用这个类
然后释放域


C# code
   //定义用于动态释放的类  [Serializable]    class CanUnloadClass:MarshalByRefObject    {        public void DoSomething()        {           //动态加载程序集,并调用        }    }    //调用的时候   #region 封装域,动态加载释放程序集            //创建一个域            AppDomain domain = AppDomain.CreateDomain("取个域的名字");            //利用这个域动态地加载类             CanUnloadClass obj = (CanUnloadClass)domain.CreateInstanceFromAndUnwrap("当前程序集路径", "加载到那个类的fullname");            //调用这个类,             obj.DoSomeThing();            //释放域,也就是释放了动态加载的程序集            AppDomain.Unload(domain);             #endregion
[解决办法]
探讨
因为我在下次运行的时候要重新生成新的dll覆盖之前的,由于一直被占用导致新的dll无法生成

[解决办法]
就是程序集名称,
比如你的类是放在
Library1.dll程序集里,程序集在当前路径下,命名空间是MyName.CanUnloadClass 
就写

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

可以参考msdn
[解决办法]
参考:

通过应用程序域AppDomain加载和卸载程序集
http://www.cnblogs.com/wayfarer/archive/2004/09/29/47896.html

热点排行