我用Assembly.Load()加载了一个自动生成的dll用于反射创建对象用完之后怎么释放这个dll,因为我在下次运行的时候要重新生成新的dll覆盖之前的,由于一直被占用导致新的dll无法生成各位有经验的大哥哥、大姐姐有什么好的办法能帮我解决这个问题.

解决方案 »

  1.   

    参数没问题的,可以正确反射生成对象,只是第二次运行的时候因为没有释放dll,在生成dll那里出问题了。
      

  2.   

    程序集需要加载在域里才能动态释放
    首先需要定义一个类,里面封装好方法动态加载你要加载的程序集,并调用反射
    然后利用域调用这个类
    然后释放域
       //定义用于动态释放的类
      [Serializable]
        class CanUnloadClass:MarshalByRefObject
        {
            public void DoSomething()
            {
               //动态加载程序集,并调用
            }
        }    //调用的时候
       #region 封装域,动态加载释放程序集
                //创建一个域
                AppDomain domain = AppDomain.CreateDomain("取个域的名字");
                //利用这个域动态地加载类
                 CanUnloadClass obj = (CanUnloadClass)domain.CreateInstanceFromAndUnwrap("当前程序集路径", "加载到那个类的fullname");
                //调用这个类,
                 obj.DoSomeThing();
                //释放域,也就是释放了动态加载的程序集
                AppDomain.Unload(domain); 
                #endregion
      

  3.   


    蒙谁呢?你可以把前一个版本的dll先拷贝到windows临时文件目录里,然后使用 Assembly.LoadFile 加载进来。.net完全可以在内存中有同一个dll的两个版本,豪不重复。比如说同样两个ABC类对象实例,可以一个是1.0.0.1来反射出来的的,另外一个是1.0.0.3反射出来的,好不冲突,而且这两个对象都是ABC类型,只不过ABC类型不等于ABC类型而已。
      

  4.   

    文件不能被覆盖的问题,不代表着不能加载同一个dll的不同版本。实际上,就算是同一个dll,如果你分别从两个不同的地方加载进来,都同时反射出ABC对象实例,也是不同的。不信你就用 Assembly.LoadFile 两次创建 assembly,然后分别实例化同一个名称的类型的两个对象实例,结果是:这两个对象虽然其类型名完全一样,但是类型并不相等,也就是我上面说的“ABC类型不等于ABC类型”。在.net中,完全可以同时加载同一个dll多次,而从它们得到类型虽然同名、但是它们是不同的。
      

  5.   


    ...  没蒙你
    我Load那个dll后程序就一直占用着那个dll,而我的程序跑一遍是要重新生成那个dll的,生成dll的名字和目录肯定是一样的,名字一样的肯定就会去覆盖那个dll,而那个dll被占用是无法删除的(我试过手动删的)。
      

  6.   

    我现在要解决的问题是,怎样做可以释放掉 Assembly.Load("")加载的那个dll
      

  7.   

    就是程序集名称,
    比如你的类是放在
    Library1.dll程序集里,程序集在当前路径下,命名空间是MyName.CanUnloadClass 
    就写CanUnloadClass obj = (CanUnloadClass)domain.CreateInstanceFromAndUnwrap("Library1.dll", "MyName.CanUnloadClass");可以参考msdn
      

  8.   

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

  9.   

    我在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)
      

  10.   


    那个CanUnloadClass类有什么要注意的地方没,为什么我domain.CreateInstanceFromAndUnwrap("Library1.dll", "MyName.CanUnloadClass")  这个方法老返回不了东西。