关于APPDomain的使用,跪求大神帮忙!急!

Sun_0506 2016-12-09 03:42:54
说说我的需求:我现在需要做个整合的软件Demo。窗体有三个按钮A、B、C,分别对应着三个DLL文件dllA、dllB、dllC,三个DLL文件分别放文件夹DebugA、DebugB、DebugC中(注意:不是放在Demo的Debug中),我点击A加载dllA、点击B加载dllB、点击C加载dllC。
原来测试使用Assembly,因为按钮需要连续点击,那么内存就会不断增加,所以想着使用APPDomain的方式,但是网上的示例现在一直走不通,憋了好几天了!!!!还请大神能根据我的需求给个示例。谢谢!
...全文
464 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sun_0506 2016-12-13
  • 打赏
  • 举报
回复
引用 17 楼 xinweilee 的回复:
如果不需要同时加载三个dll的话,点击按钮时判断上次加载的程序集是否是按钮对应的,如果是且程序集已被加载就不加载dll了,如果不是就先从dispose掉上次加载dll创建的实例,然后卸载程序集,接着加载对应程序集,创建实例。
引用 17 楼 xinweilee 的回复:
如果不需要同时加载三个dll的话,点击按钮时判断上次加载的程序集是否是按钮对应的,如果是且程序集已被加载就不加载dll了,如果不是就先从dispose掉上次加载dll创建的实例,然后卸载程序集,接着加载对应程序集,创建实例。
我到现在还没搞明白APPDomain的使用呢
足球中国 2016-12-11
  • 打赏
  • 举报
回复
asm = System.Reflection.Assembly.LoadFrom( asm搞个map集合保存下呗
  • 打赏
  • 举报
回复
引用 8 楼 shingoscar 的回复:
[quote=引用 楼主 beyondsunqixin 的回复:] 原来测试使用Assembly,因为按钮需要连续点击,那么内存就会不断增加
怎么可能!?同一个dll在进程中只会有1份,内存增加肯定是代码的缘故。[/quote] 如果没点击一次就new一个对象肯定内存会一直增加,可以用静态内存
xinweilee 2016-12-10
  • 打赏
  • 举报
回复
如果不需要同时加载三个dll的话,点击按钮时判断上次加载的程序集是否是按钮对应的,如果是且程序集已被加载就不加载dll了,如果不是就先从dispose掉上次加载dll创建的实例,然后卸载程序集,接着加载对应程序集,创建实例。
Sun_0506 2016-12-10
  • 打赏
  • 举报
回复
引用 14 楼 zj_zwl 的回复:
用域加载程序集是可行的,使用完毕后卸载域就可以释放内存. 但是使用就不那么方便了,要通过代理 如果不用域,把dll直接加载到当前程序集,用一个字典集合,key为dll的路径,value为dll程序集,只加载一次,以后就直接调用,这样更方便合理
谢谢 请问有没有相关的例子呢?我小白,确实不懂。
Sun_0506 2016-12-10
  • 打赏
  • 举报
回复
引用 13 楼 Saleayas 的回复:
创建 AppDomain CreateDomain 加载指定的程序集并创建实例 CreateInstance 等等。 使用。。。 销毁。Unload
我尝试了,但是一直走不通呀。搞不明白。
zj_zwl 2016-12-10
  • 打赏
  • 举报
回复
用域加载程序集是可行的,使用完毕后卸载域就可以释放内存. 但是使用就不那么方便了,要通过代理 如果不用域,把dll直接加载到当前程序集,用一个字典集合,key为dll的路径,value为dll程序集,只加载一次,以后就直接调用,这样更方便合理
Saleayas 2016-12-10
  • 打赏
  • 举报
回复
创建 AppDomain CreateDomain 加载指定的程序集并创建实例 CreateInstance 等等。 使用。。。 销毁。Unload
Sun_0506 2016-12-10
  • 打赏
  • 举报
回复
谁能根据根据我的需求来个例子呀 谢谢
Sun_0506 2016-12-10
  • 打赏
  • 举报
回复
引用 9 楼 Hello_Ge 的回复:
[quote=引用 8 楼 shingoscar 的回复:] [quote=引用 楼主 beyondsunqixin 的回复:] 原来测试使用Assembly,因为按钮需要连续点击,那么内存就会不断增加
怎么可能!?同一个dll在进程中只会有1份,内存增加肯定是代码的缘故。[/quote] 如果没点击一次就new一个对象肯定内存会一直增加,可以用静态内存[/quote] 谢谢回复,我现在主要是想尝试用APPDomain的形式了,Assembly折腾了很久,能满足暂时的需求,但是随着加载dll的内存的增加,dll中创建的对象清除不了,会导致莫名的冲突。
Sun_0506 2016-12-10
  • 打赏
  • 举报
回复
引用 8 楼 shingoscar 的回复:
[quote=引用 楼主 beyondsunqixin 的回复:] 原来测试使用Assembly,因为按钮需要连续点击,那么内存就会不断增加
怎么可能!?同一个dll在进程中只会有1份,内存增加肯定是代码的缘故。[/quote] 谢谢回复。以下是vb.net的代码。
GC.Collect()
        Panel2.Controls.Clear()
        asm = Nothing//每次加载前全局变量置为nothing
        obj1 = Nothing//每次加载前全局变量置为nothing
        'DeleteDir(Application.StartupPath)
        'CopyDir("E:/实验室项目/毕业项目/毕业设计_冰冷可靠性测试系统/0.冰冷可靠性测试系统/TestSystem - 全面版本--冰箱/Test/bin/Debug_冰箱/", Application.StartupPath)
        Try

            asm = System.Reflection.Assembly.LoadFrom("E:/实验室项目/毕业项目/毕业设计_冰冷可靠性测试系统/0.冰冷可靠性测试系统/TestSystem - 全面版本--冰箱/Test/bin/debug/Debug_冰箱/MainControl5.12.dll")

            Dim b() As Type = asm.GetTypes()
            Dim classtemp As Type = asm.GetType("MainControl5._12.MainUserControl")
            obj1 = asm.CreateInstance(classtemp.FullName)

            obj1.Dock = DockStyle.Fill


            obj1.InitApplicationStartPath(Application.StartupPath + "\Debug_冰箱\")
            'CallByName(obj, "InitApplicationStartPath", vbMethod, Application.StartupPath + "\Debug_冰箱\") '这里特别注意CallByName的用法

            obj1.Dock = DockStyle.Fill


            If obj1.Init() = 0 Then
                Me.Close()
                System.Environment.Exit(-1)
                Exit Sub
            End If
            Panel2.Controls.Add(obj1)
        Catch ex As Exception

        End Try
通过不停点击按钮,确实内存在不断的累加。
Poopaye 2016-12-09
  • 打赏
  • 举报
回复
引用 楼主 beyondsunqixin 的回复:
原来测试使用Assembly,因为按钮需要连续点击,那么内存就会不断增加
怎么可能!?同一个dll在进程中只会有1份,内存增加肯定是代码的缘故。
Sun_0506 2016-12-09
  • 打赏
  • 举报
回复
再顶 有么有呀 来个相应的例子
Sun_0506 2016-12-09
  • 打赏
  • 举报
回复
引用 5 楼 xinweilee 的回复:
三个bool标识,加载就置为true,再次点击时判断为true就不加载了 如果dll是加载在当前appdomain的话,还可以判断appdomain里是否已存在相应dll
突然想到这个还真不行,因为3个dll的名字是相同的,只是功能不同。看来还真得用APPDomain了。
xinweilee 2016-12-09
  • 打赏
  • 举报
回复
三个bool标识,加载就置为true,再次点击时判断为true就不加载了
如果dll是加载在当前appdomain的话,还可以判断appdomain里是否已存在相应dll
Sun_0506 2016-12-09
  • 打赏
  • 举报
回复
引用 3 楼 xinweilee 的回复:
必须每次点击按钮都重新加载dll吗,不是必须的话判断下,不要重复加载
目前想的是用一个全局变量保存唯一加载的dll。 请问假如我创建了3个变量分别存储对应的dll,我下次再点击加载的时候如果判断已存在相应的dll呢?
xinweilee 2016-12-09
  • 打赏
  • 举报
回复
必须每次点击按钮都重新加载dll吗,不是必须的话判断下,不要重复加载
Sun_0506 2016-12-09
  • 打赏
  • 举报
回复
有没有呀!急死了 我要加分啦
Sun_0506 2016-12-09
  • 打赏
  • 举报
回复
顶顶顶~~~~
本课程主要是针对ILRuntime设计一个独立的脚本热更新框,框架的优势:1.将代码热更脱离Assetbundle资源热更,独立的部分更适用于各种不同的框架。2.加快项目的逻辑更新,bug修复.(后期修bug,多数情况下并不用动到资源,只需要更新脚本代码,无需重走资源打包发布流程,大大提升效率)3.提供热更模式和正常开发模式的快速切换接口,可以让队友像平常一样去开发.4.不依赖市面上的任何AB框架,完全兼容市面上各种不同的AB框架.5.重点:希望通过它,帮助你学习、了解ILRuntime真正在项目中的应用.框架的将提供以下这些接口,这些接口将从0开始,在Unity里将C#脚本编译成dll,然后将dll放到服务器上,再将dll下载下来,进行加载,到最后从Unity主工程调用热更新的代码逻辑.1.Create hotfixdll接口将热更部分的代码 编译成dll生成dll版本配置(MD5)2.更新对比接口本地跟服务器的dll进行版本对比3.下载热更dll下载dll本身的文件下载版本记录文件4.加载热更dll加载dll实例化:AppDomain初始化:注册跨域继承适配器注册委托适配器LitJson重定向调用性能优化(CLR绑定功能)调用热更接口Hotfix.HotfixApplication.Main 进入热更逻辑5.ILMonoBehaviour用于监听组件的生命周期,实际是桥接(调用)热更的逻辑AwakeStartEnableUpdateLateUpdate.......6.添加其他常用的库DOTweenLitJsonSpineGoogle.ProtobufTextAnimation可以根据上面的方式,自行添加依赖的库... 

110,537

社区成员

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

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

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