关于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的方式,但是网上的示例现在一直走不通,憋了好几天了!!!!还请大神能根据我的需求给个示例。谢谢!
...全文
473 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
顶顶顶~~~~

111,098

社区成员

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

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

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