问题描述
是这样的,小弟在做一个C#项目项目,WinForm的,原来打算在进入系统的时候使用ListView组件,本来打算每点击一个ListView项目,弹出一个操作窗口,进行相应的操作,一共有50多个项目,小弟我设计了50个窗体文件,进行静态编译成一个项目后,发现占用了很多内存,现在我想问:1)如果我做成50个DLL(DLL也是C#开发的托管的那种)来封装相应的窗体操作,这样在启动项目之后,当我点击ListView条目的时候从DLL文件中寻找,我想问的是,这样会不会节约我的内存占用?2)这样做DLL是不是动态装载、用完后就自动卸载释放内存空间的?如果是,为什么我察看内存,好像没有释放啊,是不是DLL装载了之后就不会释放了,要等到整个项目关闭后才释放?(我原来用delphi的时候没有这种现象阿,原来用delphi动态加在窗体,关闭窗体之后,DLL窗体就是放掉了,而且很明显可以看出来)请教了!有分!
解决方案
解决方案二:
可以存放在DLL中,但50个dll可能太多了,你可以分几个大类,每个大类一个dllC#的对象通常是自动释放空间的(在没有引用之后,系统自动判断),垃圾回收有一定的时间,系统自动确定,所以你不可能马上看到效果。
解决方案三:
在.NET中,编译分为两个阶段:(1)把源代码编译为Microsoft中间语言(IL)。(2)CLR把IL编译为平台专用的代码。IL总是即时编译的(称为JIT编译),JIT编译器并不是把整个应用程序一次编译完(这样会有很长的启动时间),而是只编译它调用的那部分代码(这是其名称由来)。代码编译过一次后,得到的内部可执行代码就存储起来,直到退出该应用程序为止,这样在下次运行这部分代码时,就不需要重新编译了。Microsoft认为这个过程要比一开始就编译整个应用程序代码的效率高得多,因为任何应用程序的大部分代码实际上并不是在每次运行过程中都执行。使用JIT编译器,从来都不会编译这种代码。这解释了为什么托管IL代码的执行几乎和内部机器代码的执行速度一样快,但是并没有说明为什么Microsoft认为这会提高性能。其原因是编译过程的最后一部分是在运行时进行的,JIT编译器确切地知道程序运行在什么类型的处理器上,可以利用该处理器提供的任何特性或特定的机器代码指令来优化最后的可执行代码。传统的编译器会优化代码,但它们的优化过程是独立于代码所运行的特定处理器的。这是因为传统的编译器是在发布软件之前编译为内部机器可执行的代码。即编译器不知道代码所运行的处理器类型,例如该处理器是x86兼容处理器还是Alpha处理器,这超出了基本操作的范围。例如VisualStudio6为一般的Pentium机器进行了优化,所以它生成的代码就不能利用PentiumIII处理器的硬件特性。相反,JIT编译器不仅可以进行VisualStudio6所能完成的优化工作,还可以优化代码所运行的特定处理器。所以,你做那么多dll也没用,因为效果一样。
解决方案四:
谢谢楼上的兄弟,也就是说,打个比方:如果原来是1个静态连接的项目,启动后消耗内存60兆,改成DLL之后,是不是有可能启动项目的时候只消耗10兆内存,然后点击一个listview项目,从DLL中弹出一个窗体,如果这个DLL窗体占用10兆,那么系统中最多只占用20兆内存,用完窗体后,关闭它,是不是那个DLL窗体自动就被释放了,收回10兆内存,系统中正常情况下只会占用10兆内存,最多为20兆(加载一个DLL),而不会是60兆,从而达到节约内存的目的?不过我试了,好像我的理解不正确,因为我看内存没有释放,C#编写的DLL到底有什么用啊,怎么跟delphi,C++的传统理解不一样吗?
解决方案五:
我现在考虑的不是速度要多块,速度我不在乎,呵呵,我要的是怎么节约内存
解决方案六:
兄弟们,来帮忙啊,自己顶一下
解决方案七:
请问WinForm下将项目分解成多个DLL,这样是不是能节约内存啊!--------------理論上,是成立的。但是實際上,從我的感覺看,效果並不明顯。另外,.net的dll與傳統的dll(動態鏈接庫)完全是兩迴事,衹是文件的擴展名一樣而已。
解决方案八:
回收机制不是及时的,效果不是很明显。dll在内存中存储的时间和它的扩展名和封装没有关系,还是看你在程序中,它的生命周期~~
解决方案九:
把你的应用程序窗口最小化,然后再窗口还原,看看前后的内存占用试试。
解决方案十:
我觉得应该不会吧?
解决方案十一:
利用反射来做吧,把项目拆成几个DLL,再动态地加载它建议对DLL规划一下
解决方案十二:
我感觉回收机制回收后,即时效果不是太明显造成的,其实是没问题的.
解决方案十三:
最主要要有一个很好的规划
解决方案十四:
也就是说,1个主文件A+50个DLL,在启动项目时,都是被全部加载道内存中的是吗?我还以为是只有主文件A被放入内存,然后使用到哪个DLL的时候,再把DLL调入内存使用,用完就释放掉DLL,节省内存占用原来用Delphi是这样的,哎,C#下面的DLL怎么做的还不如从前了。小弟我现在的项目就是内存不够用啊!启动的时候窗体太多,太占资源上面兄台说的反射能解决这个问题,达到我的要求吗?
解决方案十五:
其实以当前的机器配置,大部分不是考虑的是内存够不够用的问题,而是考虑:软件的模块划分,和可维护性,尽量使得各模块直接的耦合度达到最低![个人看法]欢迎大家到我们的上下载源代码,分享.NET技术文章!
解决方案:
DLL不能节约内存,相反的,过多的使用动态链接库会提高程序资源占用,之所以用DLL,是因为这个东西比较灵活。可以随意的导入和替换(例如程序升级,事实上就是修改的DLL)。这个并不是为了帮程序节约内存而使用的。
解决方案:
反射的话可以少点内存,不过就比较费点CPU
解决方案:
其实如果项目不是很大的话本身是占不了多少内存的。要优化的是程序。
解决方案:
在打开窗体之前加入下列代码:GC.Collect();GC.WaitForPendingFinalizers();if(Environment.OSVersion.Platform==PlatformID.Win32NT)SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle,-1,-1);这样可以释放很多无用的内存
解决方案:
在打开窗体之前加入下列代码:GC.Collect();GC.WaitForPendingFinalizers();if(Environment.OSVersion.Platform==PlatformID.Win32NT)SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle,-1,-1);这样可以释放很多无用的内存
解决方案:
好好划分划分