欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#反射內(nèi)存的處理分析

 更新時(shí)間:2014年12月26日 15:15:49   投稿:shichen2014  
這篇文章主要介紹了C#反射內(nèi)存的處理,較為詳細(xì)的分析了反射加載的內(nèi)存釋放問(wèn)題,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例分析了C#反射內(nèi)存的處理。分享給大家供大家參考。具體分析如下:

這段時(shí)間由于公司的項(xiàng)目的要求,我利用c#的反射的機(jī)制做了一個(gè)客戶(hù)端框架。客戶(hù)端里的所有的模塊都是以一定形式進(jìn)行提供,例如:FORM,UserControl. 在做的過(guò)程中很簡(jiǎn)單與愉快。具體的過(guò)程如下:

1. 收集客戶(hù)的需求

2. 整理需求,形成必要的文檔

3. 通過(guò)討論大體的得到程序的界面風(fēng)格

4. 由UI設(shè)計(jì)師設(shè)計(jì)出來(lái)具體的界面形式

5. 通過(guò)需求封裝必要的服務(wù)(我們可以使用c#的WCF服務(wù)或者JAVA的服務(wù))

6. 制作服務(wù)管理框架

7. 封裝程序要使用到的控件

8. 編寫(xiě)客戶(hù)端框架

9. 編寫(xiě)模塊

10. 加載進(jìn)行測(cè)試

上面說(shuō)的就是簡(jiǎn)單的一個(gè)開(kāi)發(fā)的過(guò)程,當(dāng)然里面包括了很多的汗水。一個(gè)好的程序都要滿(mǎn)足最基本的可卸載,可插入。即插件式架構(gòu)。無(wú)論是客戶(hù)端,還是服務(wù)端都要采用插件式管理。

在做c#客戶(hù)端框架的時(shí)候,利用微軟的反射與工廠(chǎng)模式的機(jī)制的時(shí)候,里面有個(gè)很大的問(wèn)題。就是通過(guò)反射的DLL加載到內(nèi)存中的時(shí)候無(wú)法進(jìn)行內(nèi)存的釋放,只有你關(guān)閉程序的時(shí)候才進(jìn)行內(nèi)存的釋放,這點(diǎn)有很大的缺陷。我在網(wǎng)上也找了很多的解決的辦法,但是沒(méi)有一個(gè)能夠成功的。其中最經(jīng)典的是插件的卸載的方式,這種方式我也進(jìn)行的實(shí)驗(yàn),雖然能夠釋放部分內(nèi)存,但是不能釋放全部的內(nèi)存。我和很多程序員聊這個(gè)事情的時(shí)候,他們說(shuō)把一切能釋放的都釋放掉。但是你就算做到這些也不能做到很好的釋放效果(也許的我的水平不行)。今天來(lái)吐槽一下VS的內(nèi)存的釋放。VS的內(nèi)存都是通過(guò)托管的機(jī)制進(jìn)行資源的使用與釋放,對(duì)于非托管資源可以通過(guò)析構(gòu)函數(shù)與其他的方式進(jìn)行釋放。對(duì)于反射的情況微軟沒(méi)有給一個(gè)很好的辦法。如果程序員兄弟們有好的辦法提供給我們學(xué)習(xí)那將是個(gè)大的善果。

我在上面說(shuō)過(guò)通過(guò)卸載插件的方式是可以釋放部分的內(nèi)存,效果也還行,但是對(duì)于一些WCF服務(wù)寫(xiě)的控件,在通過(guò)遠(yuǎn)程的模式確實(shí)存在一些問(wèn)題。具體的部分實(shí)現(xiàn)代碼如下:

復(fù)制代碼 代碼如下:
internal class AssemblyLoader : MarshalByRefObject, IDisposable
{
#region class-level declarations
private Assembly a = null;
#endregion


#region constructors and destructors
public AssemblyLoader(string fullPath)
{
if (a == null)
{
a = Assembly.LoadFrom(fullPath);
}
}


~AssemblyLoader()
{
dispose(false);
}


public void Dispose()
{
dispose(true);
}


private void dispose(bool disposing)
{
if (disposing)
{
a = null;
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.GC.Collect(0);
}
}
#endregion
#region public functionality
public object GetObject(string typename, object[] ctorParms)
{
BindingFlags flags = BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.Public;


object o = null
;
if (a != null)
{
try
{
o = a.CreateInstance(typename, true, flags, null, ctorParms, null, null);
}
catch
{
}
}
return o;
}


public object GetObject(string typename)
{
return GetObject(typename, null);
}
#endregion

 

public class ObjectLoader : IDisposable
{
// essentially creates a parallel-hash pair setup
// one appDomain per loader
protected Hashtable domains = new Hashtable();
// one loader per assembly DLL
protected Hashtable loaders = new Hashtable();


public ObjectLoader()
{}


public object GetObject(string dllName, string typeName, object[] constructorParms)
{
AssemblyLoader al = null;
object o = null;
//Type t = null;
try
{
al = (AssemblyLoader)loaders[dllName];
}
catch (Exception) { }


if (al == null)
{
AppDomainSetup setup = new AppDomainSetup();
setup.ShadowCopyFiles = "true";
AppDomain domain = AppDomain.CreateDomain(dllName, null, setup);
int key=0;
foreach (DictionaryEntry de in domains)
{
if(de.Key.ToString()==dllName)
{
key++;
break;
}
}
if (key == 0)
{
domains.Add(dllName, domain);
}
object[] parms = { dllName };
BindingFlags bindings = BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.Public;
try
{
//al = (BCFrameWork.Client.ClientInfrm.AssemblyLoader)domain.CreateInstanceFromAndUnwrap(
// "Loader.dll", "Loader.AssemblyLoader", true, bindings, null, parms, null, null, null);
al = (AssemblyLoader)domain.CreateInstanceFromAndUnwrap(
"BestelLoadDll.dll", "BestelLoadDll.AssemblyLoader", true, bindings, null, parms, null, null, null);
}
catch
{
}
if (al != null)
{
if (!loaders.ContainsKey(dllName))
{
loaders.Add(dllName, al);
}
}
}


if (al != null)
{
o = al.GetObject(typeName, constructorParms);

}
return o;
}


public void Unload(string dllName)
{
if (domains.ContainsKey(dllName))
{
AppDomain domain = (AppDomain)domains[dllName];
AppDomain.Unload(domain);
domains.Remove(dllName);
}
}


~ObjectLoader()
{
dispose(false);
}


public void Dispose()
{
dispose(true);
}


private void dispose(bool disposing)
{
if (disposing)
{
loaders.Clear();
List removeobj = new List();
foreach (object o in domains.Keys)
{
string dllName = o.ToString();
removeobj.Add(dllName);
}
foreach (string item in removeobj)
{
Unload(item);
}
domains.Clear();
System.GC.Collect();
}
}
}

調(diào)用方式很簡(jiǎn)單,如果你了解反射就知道怎么調(diào)用,這個(gè)寫(xiě)法能夠滿(mǎn)足普通的用戶(hù)控件的反射遠(yuǎn)程加載,但是對(duì)于一些特殊的用戶(hù)控件還是沒(méi)有辦法。

希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • C#中的正則表達(dá)式介紹

    C#中的正則表達(dá)式介紹

    關(guān)于正則表達(dá)式,我們都知道挺繁瑣的。本文介紹的是C#中的正則表達(dá)式,希望對(duì)你有幫助,一起來(lái)看。
    2015-10-10
  • C#窗體間通訊的幾種常用處理方法總結(jié)

    C#窗體間通訊的幾種常用處理方法總結(jié)

    這篇文章主要介紹了C#窗體間通訊的幾種常用處理方法總結(jié),有很好的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C# Lambda表達(dá)式select()和where()的區(qū)別及用法

    C# Lambda表達(dá)式select()和where()的區(qū)別及用法

    這篇文章主要介紹了C# Lambda表達(dá)式select()和where()的區(qū)別及用法,select在linq中一般會(huì)用來(lái)提取最后篩選的元素集合,在lambda表達(dá)式中通常用where得到元素集合,需要的朋友可以參考下
    2023-07-07
  • C#獲取字符串后幾位數(shù)的方法

    C#獲取字符串后幾位數(shù)的方法

    這篇文章主要介紹了C#獲取字符串后幾位數(shù)的方法,實(shí)例分析了C#操作字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • C#實(shí)現(xiàn)Datatable排序的方法

    C#實(shí)現(xiàn)Datatable排序的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)Datatable排序的方法,在進(jìn)行C#數(shù)據(jù)庫(kù)程序設(shè)計(jì)的時(shí)候有不錯(cuò)的借鑒價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C#中的小數(shù)和百分?jǐn)?shù)計(jì)算與byte數(shù)組操作

    C#中的小數(shù)和百分?jǐn)?shù)計(jì)算與byte數(shù)組操作

    這篇文章介紹了C#中的小數(shù)和百分?jǐn)?shù)計(jì)算與byte數(shù)組操作,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C# WinForm中禁止改變窗口大小的方法

    C# WinForm中禁止改變窗口大小的方法

    這篇文章主要介紹了C# WinForm中禁止改變窗口大小的方法,需要把FormBorderStyle和MaximizeBox的值固定即可,需要的朋友可以參考下
    2014-08-08
  • C# 指針內(nèi)存控制Marshal內(nèi)存數(shù)據(jù)存儲(chǔ)原理分析

    C# 指針內(nèi)存控制Marshal內(nèi)存數(shù)據(jù)存儲(chǔ)原理分析

    這篇文章主要介紹了C# 指針 內(nèi)存控制 Marshal 內(nèi)存數(shù)據(jù)存儲(chǔ)原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 使用MSScriptControl 在 C# 中讀取json數(shù)據(jù)的方法

    使用MSScriptControl 在 C# 中讀取json數(shù)據(jù)的方法

    下面小編就為大家?guī)?lái)一篇使用MSScriptControl 在 C# 中讀取json數(shù)據(jù)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • C#獲取視頻某一幀的縮略圖的方法

    C#獲取視頻某一幀的縮略圖的方法

    這篇文章主要介紹了C#獲取視頻某一幀的縮略圖的方法,涉及執(zhí)行CMD命令及針對(duì)視頻文件操作的技巧,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-11-11

最新評(píng)論