初次使用C#做项目,请问WinForm下将项目分解成多个DLL,这样是不是能节约内存啊!

问题描述

是这样的,小弟在做一个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);这样可以释放很多无用的内存
解决方案:
好好划分划分

时间: 2024-10-31 11:19:20

初次使用C#做项目,请问WinForm下将项目分解成多个DLL,这样是不是能节约内存啊!的相关文章

.net下web项目中合并进一个winform项目

问题描述 .net下web项目中合并进一个winform项目 现在做了一个web的网站,后天有一些通信的程序和曾经在winform下做的一模一样,怎样将当初的winform程序搬到现在的web下呢?(这样能省不少事情)还望高人指点一二 解决方案 在现有的解决方案下面,选择添加现有项目,然后找到你需要合并的WINFORM项目,就可以了. 解决方案二: 但是这样添加进来的项目不知怎么回事,只能引用到winform项目下面的很少的以部分类和方法?访问不到所有?不是可访问性的问题! 解决方案三: 程序的

在WinCE6上,用SerialPort控件做的串口一直在SerialPort.Open()出异常,而在WinForm下却没问题,不知是什么回事?

问题描述 在WinCE6上,用SerialPort控件做的串口一直在SerialPort.Open()出异常,而在WinForm下却没问题,不知是什么回事? 解决方案 解决方案二:是智能设备和PC有区别吧解决方案三:具体是什么异常?一般可能是端口号写错了,或者已经被打开

VS2008+Qt一个解决方案下有多个项目是什么意思?这样做有什么用?各个项目之间文件有什么联系?

问题描述 VS2008+Qt一个解决方案下有多个项目是什么意思?这样做有什么用?各个项目之间文件有什么联系? 1.一个解决方案下有几个项目,这样是做什么用的?2.我看这几个项目里包含有部分相同的文件,这样是什么意思? 如果改动其中一个项目的文件,其他项目里的该文件会怎么样?3.之前查的资料说是什么引用,没看懂. 请求指点.谢谢你们! 解决方案 要具体看什么解决方案什么项目. 比如说一个经典的程序,分为客户端.服务器端,那么就要2个项目.其中客户端和服务器端显然共用调用接口之类的代码,那么这些代码

一起谈.NET技术,关于Winform下,获取Treeview中CheckBox选中项的技巧

背景 今天,在做一个指纹管理平台的界面上,遇到了一些问题,因为公司的基础库中没有针对Winform平台的操作,所以在一个部门选择的场景中,关于如何获取部门TreeView中被选中的项目被难住了.所幸还有一个神器叫做搜索引擎,故谷歌一番,发现Asp.net下的这个问题很好解决,但是关于Winform平台下的类似问题,如凤毛麟角啊! 当然,今天我也是查了很久,终于发现了两篇不错的文章,帮助我解决了这个问题,不敢独享,结合自己对使用其方法的心得,特意记录下来,并通过一个小例子和大家一起分享. 问题是这

Winform下的地图开发控件(GMap.NET)使用心得之三---批量解析地址经纬度坐标

在之前的文章中,介绍了两篇关于GMap.NET这样的开源地图控件,介绍了其一些基本信息以及如何进行初步的应用. Winform下的地图开发控件(GMap.NET)使用心得 Winform下的地图开发控件(GMap.NET)使用心得之二 这是一个基于Winform的地图控件.该地图控件的定义如下: GMap.NET是一个强大.免费.跨平台.开源的.NET控件,它在Windows Forms 和WPF环境中能够通过Google, Yahoo!, Bing, OpenStreetMap, ArcGIS

Winform下的地图开发控件(GMap.NET)使用心得

我们先看看GMap.NET的定义: GMap.NET是一个强大.免费.跨平台.开源的.NET控件,它在Windows Forms 和WPF环境中能够通过Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等实现寻找路径.地理编码以及地图展示功能,并支持缓存和运行在Mobile环境中. GMap.NET是一个开源的GEO地图定位和跟踪程序.就像谷歌地图.雅虎地图一样,可以自动计算两地的距离,定位经纬度,与Google地图不同的是,该项

winform指纹登录项目, 中控指纹仪

问题描述 winform指纹登录项目, 中控指纹仪 现在正在做一个winform指纹登录项目, 用的是中控指纹仪 现在就是做的软件连接不上指纹仪, 指纹仪要装的驱动也装了,但是指纹仪插在USB接口上没有任何反应, 打电话问客服 他们说指纹仪灯亮是我的软件控制的. 现在就像把指纹仪搞亮, 然后解决怎么获取图片编码,转成字符串. 有用过中控指纹仪的吗? 请指教..

急求解决-用语言编写一个项目在vc2012下

问题描述 用语言编写一个项目在vc2012下 当创建一个项目后,打开cpp文件,会发现里面有很多已经自动有得代码,现在怎样看那些代码,以及怎样用它编一个贪吃蛇的游戏 解决方案 你要用C++写贪吃蛇的话,得先学C++.再看你是写控制台下的程序还是图形界面的程序.控制台的话纯C++就可以实现了:图形界面的话得用MFC或者Qt之类的第三方控件 解决方案二: c#的winform就可以写了,,主要是算法的问题,, 解决方案三: 我用C语言编写,创建后这是我看的视频教程中的代码,他是自动生成的,这些代码要

第10章 多环境下构建项目

第10章 多环境下构建项目 本章根据实际情况,介绍多种部署环境下构建项目的配置. 在大多数公司,都会有多种项目的运行环境,例如:开发环境.测试环境.预发布环境.正式环境- 我们都会遇到这样一个问题,不同环境的一些配置是不同的,例如:数据库配置.网银接口的账号和地址配置.邮箱和短信账号配置等等.那么在maven构建项目时,需要根据不同的环境,打包不同配置. 还是用我们的crm项目进行演示,基本项目目录: 10.1 属性配置 首先,在parent项目中配置不同环境的属性,例如,我们的数据库链接和re