可以存放在DLL中,但50个dll可能太多了,你可以分几个大类,每个大类一个dllC#的对象通常是自动释放空间的(在没有引用之后,系统自动判断),垃圾回收有一定的时间,系统自动确定,所以你不可能马上看到效果。

解决方案 »

  1.   

    在.NET中,编译分为两个阶段:
    (1) 把源代码编译为Microsoft中间语言(IL)。
    (2) CLR把IL编译为平台专用的代码。
    IL总是即时编译的(称为JIT编译),JIT编译器并不是把整个应用程序一次编译完(这样会有很长的启动时间),而是只编译它调用的那部分代码(这是其名称由来)。代码编译过一次后,得到的内部可执行代码就存储起来,直到退出该应用程序为止,这样在下次运行这部分代码时,就不需要重新编译了。Microsoft认为这个过程要比一开始就编译整个应用程序代码的效率高得多,因为任何应用程序的大部分代码实际上并不是在每次运行过程中都执行。使用JIT编译器,从来都不会编译这种代码。
    这解释了为什么托管IL代码的执行几乎和内部机器代码的执行速度一样快,但是并没有说明为什么Microsoft认为这会提高性能。其原因是编译过程的最后一部分是在运行时进行的,JIT编译器确切地知道程序运行在什么类型的处理器上,可以利用该处理器提供的任何特性或特定的机器代码指令来优化最后的可执行代码。
    传统的编译器会优化代码,但它们的优化过程是独立于代码所运行的特定处理器的。这是因为传统的编译器是在发布软件之前编译为内部机器可执行的代码。即编译器不知道代码所运行的处理器类型,例如该处理器是x86兼容处理器还是Alpha处理器,这超出了基本操作的范围。例如Visual Studio 6为一般的Pentium机器进行了优化,所以它生成的代码就不能利用Pentium III处理器的硬件特性。相反,JIT编译器不仅可以进行Visual Studio 6所能完成的优化工作,还可以优化代码所运行的特定处理器。
    所以,你做那么多dll也没用,因为效果一样。
      

  2.   

    谢谢楼上的兄弟,也就是说,打个比方:如果原来是1个静态连接的项目,启动后消耗内存60兆,改成DLL之后,是不是有可能启动项目的时候只消耗10兆内存,然后点击一个listview项目,从DLL中弹出一个窗体,如果这个DLL窗体占用10兆,那么系统中最多只占用20兆内存,用完窗体后,关闭它,是不是那个DLL窗体自动就被释放了,收回10兆内存,系统中正常情况下只会占用10兆内存,最多为20兆(加载一个DLL),而不会是60兆,从而达到节约内存的目的?不过我试了,好像我的理解不正确,因为我看内存没有释放,C#编写的DLL到底有什么用啊,怎么跟delphi,C++的传统理解不一样吗?
      

  3.   

    请问WinForm下将项目分解成多个DLL,这样是不是能节约内存啊!
    --------------
    理論上,是成立的。但是實際上,從我的感覺看,效果並不明顯。
    另外,.net的dll與傳統的dll(動態鏈接庫)完全是兩迴事,衹是文件的擴展名一樣而已。
      

  4.   

    回收机制不是及时的,效果不是很明显。
    dll在内存中存储的时间和它的扩展名和封装没有关系,还是看你在程序中,它的生命周期~~
      

  5.   

    利用反射来做吧,把项目拆成几个DLL,再动态地加载它
    建议对DLL规划一下
      

  6.   

    也就是说,1个主文件A+50个DLL,在启动项目时,都是被全部加载道内存中的是吗?
    我还以为是只有主文件A被放入内存,然后使用到哪个DLL的时候,再把DLL调入内存使用,用完就释放掉DLL,节省内存占用原来用Delphi是这样的,哎,C#下面的DLL怎么做的还不如从前了。小弟我现在的项目就是内存不够用啊!启动的时候窗体太多,太占资源上面兄台说的反射能解决这个问题,达到我的要求吗?
      

  7.   

    其实以当前的机器配置,大部分不是考虑的是内存够不够用的问题,而是考虑:软件的模块划分,和可维护性,尽量使得各模块直接的耦合度达到最低!
    [个人看法]欢迎大家到我们的MSPROJECT开源技术上下载源代码,分享.NET技术文章!
      

  8.   

    DLL不能节约内存,相反的,过多的使用动态链接库会提高程序资源占用,之所以用DLL,是因为这个东西比较灵活。可以随意的导入和替换(例如程序升级,事实上就是修改的DLL)。这个并不是为了帮程序节约内存而使用的。
      

  9.   

    反射的话可以少点内存,不过就比较费点CPU
      

  10.   

    在打开窗体之前加入下列代码:
    GC.Collect(); GC.WaitForPendingFinalizers(); if (Environment.OSVersion.Platform == PlatformID.Win32NT)     SetProcessWorkingSetSize(System.Diagnostics. Process.GetCurrentProcess().Handle, -1, -1);
    这样可以释放很多无用的内存
      

  11.   

    在打开窗体之前加入下列代码:
    GC.Collect(); GC.WaitForPendingFinalizers(); if (Environment.OSVersion.Platform == PlatformID.Win32NT)     SetProcessWorkingSetSize(System.Diagnostics. Process.GetCurrentProcess().Handle, -1, -1);
    这样可以释放很多无用的内存