最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

1. 收集客戶的需求

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

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

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

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

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

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

8. 編寫客戶端框架

9. 編寫模塊

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

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

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

我在上面說過通過卸載插件的方式是可以釋放部分的內(nèi)存,效果也還行,但是對于一些WCF服務(wù)寫的控件,在通過遠(yuǎn)程的模式確實(shí)存在一些問題。具體的部分實(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)用方式很簡單,如果你了解反射就知道怎么調(diào)用,這個寫法能夠滿足普通的用戶控件的反射遠(yuǎn)程加載,但是對于一些特殊的用戶控件還是沒有辦法。

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

相關(guān)文章

  • unity實(shí)現(xiàn)場景跳轉(zhuǎn)

    unity實(shí)現(xiàn)場景跳轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)場景跳轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C#設(shè)計模式編程中運(yùn)用適配器模式結(jié)構(gòu)實(shí)戰(zhàn)演練

    C#設(shè)計模式編程中運(yùn)用適配器模式結(jié)構(gòu)實(shí)戰(zhàn)演練

    這篇文章主要介紹了C#設(shè)計模式編程中運(yùn)用適配器模式結(jié)構(gòu)實(shí)戰(zhàn)演練,并總結(jié)了適配器模式的優(yōu)缺點(diǎn)和適用場景以及.NET框架中的應(yīng)用,需要的朋友可以參考下
    2016-02-02
  • c#文本加密程序代碼示例

    c#文本加密程序代碼示例

    這是一個加密軟件,但只限于文本加密,加了窗口控件的滑動效果,詳細(xì)看下面的代碼
    2013-11-11
  • DevExpress的DateEdit設(shè)置顯示日期和時間的方法

    DevExpress的DateEdit設(shè)置顯示日期和時間的方法

    本文主要介紹了DevExpress的DateEdit設(shè)置顯示日期和時間的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C#網(wǎng)絡(luò)請求與JSON解析的示例代碼

    C#網(wǎng)絡(luò)請求與JSON解析的示例代碼

    這篇文章主要介紹了C#網(wǎng)絡(luò)請求與JSON解析的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C#程序打成 一鍵安裝包-InstallShield教程

    C#程序打成 一鍵安裝包-InstallShield教程

    最近找到個打包工具,挺不錯的。下面簡單的介紹下使用方法
    2012-01-01
  • C#和JavaScript實(shí)現(xiàn)交互的方法

    C#和JavaScript實(shí)現(xiàn)交互的方法

    最近做一個小項目不可避免的需要前端腳本與后臺進(jìn)行交互。由于是在asp.net中實(shí)現(xiàn),故問題演化成asp.net中jiavascript與后臺c#如何進(jìn)行交互。
    2015-05-05
  • C#關(guān)鍵字Check簡單介紹

    C#關(guān)鍵字Check簡單介紹

    這篇文章主要介紹了C#關(guān)鍵字Check功能描述及注意事項,checke關(guān)鍵字主要用于對整型類型算術(shù)運(yùn)算和轉(zhuǎn)換顯式啟用溢出檢查,本文通過程序演示給大家詳細(xì)介紹,需要的朋友一起看看吧
    2022-04-04
  • C#中volatile與lock用法

    C#中volatile與lock用法

    這篇文章主要介紹了C#中volatile與lock用法,較為詳細(xì)的分析了C#中volatile與lock的適用情況及用法實(shí)例,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • C#使用Enum.TryParse()實(shí)現(xiàn)枚舉安全轉(zhuǎn)換

    C#使用Enum.TryParse()實(shí)現(xiàn)枚舉安全轉(zhuǎn)換

    這篇文章介紹了C#使用Enum.TryParse()實(shí)現(xiàn)枚舉安全轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08

最新評論

深水埗区| 华亭县| 凤阳县| 伊金霍洛旗| 泰顺县| 镇远县| 莎车县| 克东县| 拉萨市| 桃园县| 西乌珠穆沁旗| 古田县| 周口市| 霞浦县| 循化| 瑞昌市| 江源县| 南溪县| 兴仁县| 桐城市| 富川| 临夏县| 玛沁县| 无棣县| 拜泉县| 台江县| 迁安市| 屯昌县| 余江县| 宜君县| 安仁县| 蒙城县| 西昌市| 辰溪县| 鹤岗市| 稻城县| 手机| 荔波县| 高尔夫| 肇东市| 天水市|