青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

APPDomain,Assabley,madel,namespace 概念

現(xiàn)在是虛擬機(jī)時(shí)代了, Java 稱(chēng)作 JVM ( Java 虛擬機(jī)), .NET 稱(chēng)作 FrameWork (框架)。對(duì)照著兩個(gè)體系,當(dāng)中有很多異同,不過(guò)我感興趣的是 .NET 中稱(chēng)作“ AppDomain ”(應(yīng)用程序域)的東東。這個(gè)概念如何準(zhǔn)確的理解,對(duì)于 .NET 開(kāi)發(fā)來(lái)講有何意義?使用它需要注意些什么?

 

微軟的 .NET 文檔中 appDomain 的解釋相當(dāng)簡(jiǎn)略(卻不是很清楚 J ) : “一個(gè)應(yīng)用程序在其中執(zhí)行的獨(dú)立環(huán)境”。為執(zhí)行托管代碼提供隔離、卸載和安全邊界。到底如何理解呢?我想是不是可以這樣來(lái)準(zhǔn)確體會(huì)這個(gè)概念:

1 、 appDomain 是 .NET 框架獨(dú)有的概念。找不到其他技術(shù)體系中貼切的參照概念,是微軟自己的東東。很多人認(rèn)為可以同進(jìn)程的概念相同,我很不贊同:其一,“進(jìn)程”是操作系統(tǒng)中的概念,在虛擬機(jī) / 框架之類(lèi)的體系中有著自己的定義和功能,顯然這樣理解 appDomain 是錯(cuò)誤的;其二,“在應(yīng)用程序域和線(xiàn)程之間沒(méi)有一對(duì)一的關(guān)聯(lián),多個(gè)線(xiàn)程可以屬于一個(gè)應(yīng)用程序域,盡管給定的線(xiàn)程并不局限于一個(gè)應(yīng)用程序域,但在任何給定時(shí)間,線(xiàn)程都在一個(gè)應(yīng)用程序域中執(zhí)行。”( .NET FrameWork SDK 中的描述),如果這里的“應(yīng)用程序域”換成“進(jìn)程”講得通么?

2 、隔離性。也不怪有人直接套解為進(jìn)程, AppDomain 有著代碼執(zhí)行隔絕的特性,就好像進(jìn)程做的一樣。 appDomain 的對(duì)象、代碼可以認(rèn)為相互隔離,甚至一個(gè) appDomain 中的代碼調(diào)用另外 appDomain 的對(duì)象(的數(shù)據(jù)或者方法等),需要類(lèi)似 DCOM 中的“列集 / 散集”才可以進(jìn)行(在類(lèi)繼承關(guān)系中 appDomain 類(lèi) 繼承自 MarshalByRefObject 類(lèi))。每一個(gè) appDomain 可以單獨(dú)被調(diào)試、啟動(dòng)、停止,有著自己的默認(rèn)的異常處理,一個(gè) appDomain 崩潰了,不會(huì)影響其他的 appDomain 。可以理解為 .NET 的“邏輯進(jìn)程”。

.NET 中允許同一個(gè)應(yīng)用程序的不同版本可以并存,消除了所謂的“ dll hell ”。通過(guò)創(chuàng)建不同的 appDomain ,我們可以讓某個(gè)托管的程序集的 1.0 和 2.0 的版本同時(shí)執(zhí)行(只要他們自身并不存在某個(gè)特定資源的非兼容性的存取訪(fǎng)問(wèn))

3 、安全性。由于代碼隔離,可以防止某個(gè)危險(xiǎn)代碼對(duì)于其他的 appDomain 的影響。而且可以通過(guò)分配特定的安全分配,確定 appDomain 中的執(zhí)行代碼對(duì)于系統(tǒng)安全保護(hù)資源的訪(fǎng)問(wèn)。

4 、獨(dú)立性。每一個(gè) appDomain 都由 .NET 的框架分配了專(zhuān)用的存儲(chǔ)區(qū)(應(yīng)用域局部存儲(chǔ))。任何對(duì)象都可以訪(fǎng)問(wèn)自己當(dāng)前所在的 appDomain 的局部存儲(chǔ)區(qū),這個(gè)局部存儲(chǔ)區(qū)被整個(gè) appDomain 中的對(duì)象共享,也包括進(jìn)入 appDomain 的線(xiàn)程(運(yùn)行于同一個(gè) appDomain 的線(xiàn)程可以通過(guò)這個(gè)局部存儲(chǔ)進(jìn)行通信)。

5 、同進(jìn)程、線(xiàn)程、程序集的關(guān)系。同進(jìn)程屬于多對(duì)一的關(guān)系,即一個(gè)進(jìn)程中可以有多個(gè) appDomain ,但是 appDomain 只能存在于某個(gè)進(jìn)程中(顯然,正如同上文:進(jìn)程同 appDomain 屬于不同的概念)。缺省情況下,如果你沒(méi)有自己創(chuàng)建多個(gè) appDomain ,一個(gè)進(jìn)程啟動(dòng)后自動(dòng)創(chuàng)建一個(gè) appDomain 。而線(xiàn)程執(zhí)行可以涉及多個(gè) appDomain ,但某個(gè)特定時(shí)刻,線(xiàn)程僅存在于一個(gè) appDomain 中,且線(xiàn)程可以進(jìn)入其他的 appDomain 。某個(gè)程序集的某個(gè)實(shí)例屬于具體的 appDomain ,由 appDomain 在自己的范圍內(nèi)加載,并按照程序集創(chuàng)建相應(yīng)的對(duì)象。 AppDomain 是程序集的執(zhí)行環(huán)境,同時(shí)程序集作為靜態(tài)實(shí)體,可以被多個(gè) appDomain 加載執(zhí)行。

 

很多人文章講了相關(guān)的編程(但沒(méi)有將清楚什么是 appDomain ) , 鄙人也不想抄,基本上涉及 appDomain 的創(chuàng)建、卸載、獲得當(dāng)前 appDomain 實(shí)例、操作 appDomain 、 appDomain 中創(chuàng)建對(duì)象調(diào)用對(duì)象、加載特定程序集、執(zhí)行程序、 appDomain 之間協(xié)調(diào)(回調(diào)、事件等)。可以參考我收集的一些 URL:

appDomain 參考

http://tech.ccidnet.com/pub/article/c1136_a30763_p1.html

http://www.yesky.com/SoftChannel/72342380484755456/20030819/1722679_2.shtml

http://www.microsoft.com/china/msdn/library/dncscol/html/csharp05162002.asp

http://wwwb.pconline.com.cn/pcedu/empolder/gj/vb/doc/10712_2.htm

http://www.csdn.net/Develop/Read_Article.asp?Id=19285

http://www.csdn.net/Develop/Read_Article.asp?Id=13303

      

SDK 文檔中的參考:

ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemappdomainclasstopic.htm

ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemappdomainmemberstopic.htm

 

通過(guò)前面討論知道,其實(shí)在一般情況下我們是不需要理會(huì) appDomain 的,不過(guò),出現(xiàn)此概念在 .NET 中決非多余,有著自己存在的理由,那么具體載那些情境下要使用 appDomain 呢?

1、需要隔離的程序集,譬如一些特別容易引起崩潰的代碼可以考慮單獨(dú)運(yùn)行于一個(gè)特定的 appDomain

2、不同安全級(jí)別的程序集,如果需要為自己的代碼劃分安全執(zhí)行的邊界,可以考慮將不同安全級(jí)別的代碼單獨(dú)創(chuàng)建于某個(gè)設(shè)定了不同安全信息的 appDomain

3、從性能上考慮,有些程序集可能會(huì)消耗大量資源,盡管在托管環(huán)境下,基本上不存在資源消耗漏洞,但是總會(huì)存在特定時(shí)間訪(fǎng)問(wèn)密集造成消耗大量資源的情況,這時(shí)可以考慮創(chuàng)建單獨(dú)的 appDomain ,在資源消耗超過(guò)臨界點(diǎn)后進(jìn)行 appDomain 的卸載,適應(yīng)系統(tǒng)運(yùn)行要求。 Asp.net 中利用不同得 appDomain 來(lái)提供支持就是為了防止一個(gè)應(yīng)用程序的崩潰影響其他 asp.net 應(yīng)用程序,同時(shí) , 在不重新啟動(dòng)的系統(tǒng)不重新啟動(dòng) IIS 不影響 asp.net 自身服務(wù)提供的情況下將一個(gè) appDomain 卸掉同時(shí)啟動(dòng)新的 appDomain ,理想情況下可以實(shí)現(xiàn) web 系統(tǒng)的長(zhǎng)時(shí)間在線(xiàn)(這以往是昂貴的 unix 的特性,終于被 MS “借鑒”了)。

4、不同版本的同一應(yīng)用程序集的同時(shí)運(yùn)行。這個(gè)在 COM 時(shí)代是一個(gè)大問(wèn)題,現(xiàn)在通過(guò) appDomain ,實(shí)現(xiàn)了在一個(gè)進(jìn)程中執(zhí)行版本不同的兩個(gè)程序集,可以做到良好的兼容性。

5、動(dòng)態(tài)加載一些程序。

其它應(yīng)用等待大家補(bǔ)充:)

我們知道,進(jìn)程是操作系統(tǒng)用于隔離眾多正在運(yùn)行的應(yīng)用程序的機(jī)制。在.Net之前,每一個(gè)應(yīng)用程序被加載到單獨(dú)的進(jìn)程中,并為該進(jìn)程指定私有的虛擬內(nèi)存。進(jìn)程不能直接訪(fǎng)問(wèn)物理內(nèi)存,操作系統(tǒng)通過(guò)其它的處理把這些虛擬內(nèi)存映射到物理內(nèi)存或IO設(shè)備的某個(gè)區(qū)域,而這些物理內(nèi)存之間不會(huì)有重疊,這就決定了一個(gè)進(jìn)程不可能訪(fǎng)問(wèn)分配給另一個(gè)進(jìn)程的內(nèi)存。相應(yīng)地,運(yùn)行在該進(jìn)程中的應(yīng)用程序也不可能寫(xiě)入另一個(gè)應(yīng)用程序的內(nèi)存,這確保了任何執(zhí)行出錯(cuò)的代碼不會(huì)損害其地址空間以外的應(yīng)用程序。在這種機(jī)制下,進(jìn)程作為應(yīng)用程序之間一個(gè)獨(dú)立而安全的邊界在很大程度上提高了運(yùn)行安全。

進(jìn)程的缺點(diǎn)是降低了性能。許多一起工作的進(jìn)程需要相互通信,而進(jìn)程卻不能共享任何內(nèi)存,你不能通過(guò)任何有意義的方式使用從一個(gè)進(jìn)程傳遞到另一個(gè)進(jìn)程的內(nèi)存指針。此外,你不能在兩個(gè)進(jìn)程間進(jìn)行直接調(diào)用。你必須代之以使用代理,它提供一定程度的間接性。雖然,使用動(dòng)態(tài)連接庫(kù)dll讓所有的組件運(yùn)行在同一空間,一定程度上可以提高性能,但這些組件相互影響,一個(gè)組件的錯(cuò)誤將極有可能導(dǎo)致整個(gè)應(yīng)用程序的崩潰,“dll地獄”更是讓許多應(yīng)用程序難以避免。


應(yīng)用程序域(AppDomain)
在.Net中,應(yīng)用程序有了一個(gè)新的邊界:應(yīng)用程序域(以下簡(jiǎn)稱(chēng)域)。它是一個(gè)用于隔離應(yīng)用程序的虛擬邊界。為了禁止不應(yīng)交互的代碼進(jìn)行交互,這種隔離是必要的。.Net的應(yīng)用程序在域?qū)哟紊线M(jìn)行隔離,一個(gè)域中的應(yīng)用程序不能直接訪(fǎng)問(wèn)另一個(gè)域中的代碼和數(shù)據(jù)。(可以間接啊)這種隔離使得在一個(gè)應(yīng)用程序范圍內(nèi)創(chuàng)建的所有對(duì)象都在一個(gè)域內(nèi)創(chuàng)建,確保在同一進(jìn)程中一個(gè)域內(nèi)運(yùn)行的代碼不會(huì)影響其他域內(nèi)的應(yīng)用程序,大大提高了運(yùn)行的安全。

.Net結(jié)構(gòu)中,由于公共語(yǔ)言運(yùn)行庫(kù)能夠驗(yàn)證代碼是否為類(lèi)型安全的代碼,所以它可以提供與進(jìn)程邊界一樣大的隔離級(jí)別,其性能開(kāi)銷(xiāo)也要低得多。你可以在單個(gè)進(jìn)程中運(yùn)行幾個(gè)域,而不會(huì)造成進(jìn)程間調(diào)用或切換等方面的額外開(kāi)銷(xiāo)。這種方法是把任何一個(gè)進(jìn)程分解到多個(gè)域中,允許多個(gè)應(yīng)用程序在同一進(jìn)程中運(yùn)行,每個(gè)域大致對(duì)應(yīng)一個(gè)應(yīng)用程序,運(yùn)行的每個(gè)線(xiàn)程都在一個(gè)特殊的域中。如果不同的可執(zhí)行文件都運(yùn)行在同一個(gè)進(jìn)程空間中,它們就能輕松地共享數(shù)據(jù)或直接訪(fǎng)問(wèn)彼此的數(shù)據(jù)。這種代碼同運(yùn)行同一個(gè)進(jìn)程但域不同的類(lèi)型安全代碼一起運(yùn)行時(shí)是安全的。在一個(gè)進(jìn)程內(nèi)運(yùn)行多個(gè)應(yīng)用程序的能力顯著增強(qiáng)了服務(wù)器的可伸縮性。


域間通信
域是.Net 帶來(lái)的一個(gè)重要改進(jìn),它不僅將眾多在運(yùn)行的應(yīng)用程序隔離開(kāi)來(lái),還不影響彼此間通信。雖然,公共語(yǔ)言運(yùn)行庫(kù)禁止在不同域中的對(duì)象之間進(jìn)行直接調(diào)用,但我們可以復(fù)制這些對(duì)象,或通過(guò)代理訪(fǎng)問(wèn)這些對(duì)象。如果以前一種方式,那么對(duì)該對(duì)象的調(diào)用為本地調(diào)用。也就是說(shuō),調(diào)用方和被引用的對(duì)象位于同一域中。如果通過(guò)代理訪(fǎng)問(wèn)對(duì)象,調(diào)用方和被引用的對(duì)象位于不同的域中,對(duì)該對(duì)象的調(diào)用被視為遠(yuǎn)程調(diào)用,這種情形與兩個(gè)進(jìn)程間的調(diào)用或兩臺(tái)計(jì)算機(jī)間的調(diào)用結(jié)構(gòu)大致相同。這時(shí),需要被引用對(duì)象的元數(shù)據(jù)對(duì)于兩個(gè)域均可用,以便.Net即時(shí)編譯JIT能正確執(zhí)行。


域與線(xiàn)程的關(guān)系
在.Net中,線(xiàn)程是公共語(yǔ)言運(yùn)行庫(kù)用來(lái)執(zhí)行代碼的操作系統(tǒng)構(gòu)造。在運(yùn)行時(shí),所有托管代碼均加載到一個(gè)域中,由特定的操作系統(tǒng)線(xiàn)程來(lái)運(yùn)行。然而,域和線(xiàn)程之間并不具有一一對(duì)應(yīng)關(guān)系。在任意給定時(shí)間,單個(gè)域中可以執(zhí)行不止一個(gè)線(xiàn)程,而且特定線(xiàn)程也并不局限在單個(gè)域內(nèi)。也就是說(shuō),線(xiàn)程可以跨越域邊界,不為每個(gè)域創(chuàng)建新線(xiàn)程。當(dāng)然,在指定時(shí)刻,每一線(xiàn)程都只能在一個(gè)域中執(zhí)行。運(yùn)行庫(kù)會(huì)跟蹤所有域中有哪些線(xiàn)程正在運(yùn)行。通過(guò)調(diào)用.Net類(lèi)庫(kù)的 Thread.GetDomain 方法,你還可以確定正在執(zhí)行的線(xiàn)程所在的域。


域的創(chuàng)建
作為公共語(yǔ)言運(yùn)行庫(kù)的隔離單元,域在進(jìn)程中創(chuàng)建和運(yùn)行。.Net結(jié)構(gòu)中,運(yùn)行時(shí)宿主(也叫作運(yùn)行時(shí)主機(jī))是負(fù)責(zé)將運(yùn)行時(shí)載入進(jìn)程并在域中執(zhí)行用戶(hù)代碼和托管代碼的應(yīng)用程序。運(yùn)行時(shí)宿主包括ASP.Net、瀏覽器Internet Explorer 和 Windows等外殼程序,負(fù)責(zé)創(chuàng)建進(jìn)程和默認(rèn)域,例如,Asp.Net為每個(gè)運(yùn)行在web服務(wù)器上的web應(yīng)用程序創(chuàng)建一個(gè)域。瀏覽器Internet explore創(chuàng)建運(yùn)行受管制控件的域。

對(duì)多數(shù)應(yīng)用程序,你并不必須創(chuàng)建相應(yīng)的域,每次CLR在初始化一個(gè)進(jìn)程時(shí),將創(chuàng)建默認(rèn)域,并使該進(jìn)程運(yùn)行于這個(gè)默認(rèn)域下。然而,默認(rèn)域不能由任何系統(tǒng)調(diào)用來(lái)卸載,該域只有在進(jìn)程被卸載之后才能被銷(xiāo)毀。如果直接在默認(rèn)域下編程或運(yùn)行代碼,而由于某種原因域的代碼崩潰了,那么就有使得整個(gè)服務(wù)隨之崩潰的風(fēng)險(xiǎn)。

于是,針對(duì)不同的應(yīng)用程序,應(yīng)該創(chuàng)建和配置相應(yīng)的域并載入適當(dāng)?shù)某绦蚣#甆et為此提供了豐富的類(lèi)庫(kù)。其中,AppDomain 類(lèi)是域的編程接口,其大量的(重載)方法能完成以下任務(wù):

· 創(chuàng)建域

· 在域中加載程序集和類(lèi)型

· 枚舉域中的程序集和線(xiàn)程

· 卸載域

創(chuàng)建新域時(shí),使用AppDomain 類(lèi)的靜態(tài)方法CreateDomain。你可以為域命名并按該名稱(chēng)來(lái)引用域。下面的示例語(yǔ)句創(chuàng)建新域,并為它指定名稱(chēng) MyDomain:                AppDomain myDomain = AppDomain.CreateDomain("MyDomain");
然后你可以查詢(xún)當(dāng)前域的名稱(chēng)和新創(chuàng)建子域的名稱(chēng):                 string hostDomain=AppDomain.CurrentDomain.FriendlyName;
string childDomain=myDomain.FriendlyName;

在這里,屬性FriendlyName表示的是域的友好名稱(chēng),友好名稱(chēng)通過(guò)從程序集的基本代碼中去除目錄路徑而形成。例如,文件名為 "d:\MyAppDomain\MyAssembly.exe" 的程序集加載到默認(rèn)域中,域的友好名稱(chēng)就是 "MyAssembly.exe"。

更一般的是,在創(chuàng)建域之前,先設(shè)置好域的參數(shù),這可以通過(guò)類(lèi)AppDomainSetup來(lái)完成。該類(lèi)的ApplicationBase 屬性定義應(yīng)用程序的根目錄, AppDomainSetup 類(lèi)還有一個(gè)極重要的屬性變量LoaderOptimizzation,取值可以是MultiDomain,MultiDomainHost和SignleDomain等,用以指定被加載程序集的類(lèi)別(共享程序集或域?qū)S贸绦蚣纾韵抡Z(yǔ)句把程序集設(shè)置為域?qū)S贸绦蚣?         appDomainSetup.LoaderOptimization=LoaderOptimizatiion.SigleDomain;

對(duì)以上兩個(gè)方面簡(jiǎn)單歸納一下,對(duì)域的典型操作就包括:設(shè)置參數(shù)然后創(chuàng)建兩個(gè)步驟,語(yǔ)句示例如下:           AppDomainSetup appDomainSetup=new AppDomainSetup();//實(shí)例化域設(shè)置
appDomainSetup.LoaderOptimization=LoaderOptimization.SingleDomain; //指定域類(lèi)別
AppDoman ad=AppDomain.CreateDomain(domainName,appDomainSetup); //創(chuàng)建域
...
//應(yīng)用程序在這里運(yùn)行代碼
...
AppDomain.Unload(ad);//卸載域

卸載域
當(dāng)使用完域時(shí),可使用AppDomain類(lèi)Unload()靜態(tài)方法將其卸載。要卸載進(jìn)程中在運(yùn)行的托管代碼,只能卸載代碼運(yùn)行時(shí)所在的域而不能卸載單獨(dú)的程序集或類(lèi)型,Unload方法會(huì)正常關(guān)閉指定的域。這時(shí),載入域的所有程序集都會(huì)被移除,并且無(wú)法再使用。不過(guò),如果域中的程序集對(duì)域是非特定的(域無(wú)關(guān)程序集,也即共享程序集),則程序集的數(shù)據(jù)還會(huì)保留在內(nèi)存中,直至整個(gè)進(jìn)程關(guān)閉。除了關(guān)閉整個(gè)進(jìn)程,沒(méi)有機(jī)制可以卸載這類(lèi)程序集。由于一個(gè)進(jìn)程中允許包含多個(gè)域,某個(gè)域可以在不停止整個(gè)進(jìn)程的情況下卸載。以這樣的方式卸載不再需要的代碼,可以減少內(nèi)存占用并極大提高應(yīng)用程序的可縮放性。此外,由于線(xiàn)程并不與域一一對(duì)應(yīng),當(dāng)域中存在活動(dòng)線(xiàn)程時(shí),調(diào)用AppDomain.Unload方法可能無(wú)法將域卸載并導(dǎo)致異常。


在域中加載程序集
從上面的論述不難看出:要運(yùn)行應(yīng)用程序,必須首先將程序集(.Net下經(jīng)編譯產(chǎn)生,包含IL中間語(yǔ)言、元數(shù)據(jù)及清單等)加載到域中。而且一個(gè)域中可裝載多個(gè)程序集。默認(rèn)情況下,公共語(yǔ)言運(yùn)行庫(kù)自動(dòng)將一個(gè)程序集加載到包含引用該程序集的代碼的域。通過(guò)此方法,該程序集的代碼和數(shù)據(jù)獨(dú)立于使用該程序集的應(yīng)用程序。

自行創(chuàng)建域的好處之一便是可以指定如何裝載程序集。在域中有以下兩種方式加載程序集:

1、將當(dāng)前程序集加載入單獨(dú)的域中,同一個(gè)程序集可能有多個(gè)副本;

2、以非特定于域的形式加載程序集,讓一個(gè)程序集在多個(gè)域間共享;

這兩種方式各自偏重于安全性和性能,需要視具體情況在二者之間權(quán)衡。具體地,在 .Net 框架中,System.Reflection.Assembly 類(lèi)提供以下靜態(tài)方法將程序集加載至域:

· Load()在給頂程序集名稱(chēng)的前提下,加載該程序集:     Assembly SampleAssembly;

SampleAssembly = Assembly.Load("System.Data");//根據(jù)類(lèi)型加載程序集
· LoadFrom()在已知程序集文件名或路徑等信息的情況下加載程序集:    Assembly SampleAssembly;

SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");//根據(jù)已有程序集名稱(chēng)加載
參考資料:

《Microsoft .NET Framework程序設(shè)計(jì)》
《.NET Framework高級(jí)編程》
《.NET框架精髓 》等

posted on 2006-04-19 12:27 夢(mèng)在天涯 閱讀(859) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C#/.NET

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 461
  • 文章 - 4
  • 評(píng)論 - 746
  • 引用 - 0

常用鏈接

隨筆分類(lèi)

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1811980
  • 排名 - 5

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              夜夜夜精品看看| 久久精品国产免费看久久精品| 美国十次了思思久久精品导航| 激情另类综合| 欧美jizz19性欧美| 欧美大胆成人| 亚洲香蕉网站| 午夜精品久久久久| 永久域名在线精品| 亚洲国产高清在线观看视频| 麻豆乱码国产一区二区三区| 日韩天天综合| 亚洲午夜一级| 激情懂色av一区av二区av| 欧美激情一区二区在线| 性欧美1819sex性高清| 久久青草久久| 久久青青草综合| 日韩亚洲欧美高清| 亚洲一级网站| 亚洲电影欧美电影有声小说| 亚洲精品永久免费| 国产亚洲欧洲997久久综合| 欧美黑人多人双交| 欧美视频一区二区三区在线观看 | 欧美日韩亚洲国产一区| 久久久久久久久久久成人| 欧美大片一区二区| 久久久精品一区| 欧美日韩aaaaa| 久久午夜av| 国产精品久久99| 亚洲福利视频一区| 国产一区二区三区av电影| 最新国产拍偷乱拍精品| 国产啪精品视频| 亚洲精选一区二区| 亚洲高清av在线| 亚洲男人的天堂在线aⅴ视频| 亚洲精品久久7777| 久久久久久久网| 小黄鸭视频精品导航| 欧美精品v日韩精品v韩国精品v | 欧美高清成人| 国产日韩亚洲欧美综合| 日韩网站在线| 亚洲乱码久久| 六月婷婷一区| 久久综合一区二区| 国产欧美日韩综合| 亚洲一区二区高清| 亚洲小说欧美另类社区| 欧美高清视频在线观看| 美日韩精品视频| 国产一区二区三区久久| 亚洲一区精品在线| 亚洲一区二区三区在线看| 欧美精品久久久久久| 欧美高潮视频| 亚洲高清在线精品| 久久一区免费| 蜜桃视频一区| 亚洲福利视频网站| 裸体歌舞表演一区二区| 欧美第十八页| 亚洲国产综合视频在线观看| 久久网站免费| 亚洲电影在线看| 亚洲精品美女在线| 欧美人成免费网站| 日韩一级黄色av| 亚洲欧美另类在线观看| 欧美午夜一区二区| 亚洲在线观看视频网站| 久久精品国产77777蜜臀| 午夜精品免费视频| 欧美一区二区三区精品| 国产一区二区三区四区在线观看 | 老司机一区二区| 在线欧美福利| 欧美—级在线免费片| 日韩一区二区久久| 欧美一区二区三区视频| 国内精品久久久| 美女主播精品视频一二三四| 亚洲黄色影片| 亚洲欧美福利一区二区| 国产欧美一区二区精品忘忧草 | 亚洲午夜在线观看视频在线| 久久精品欧美| 亚洲精品一区二| 国产精品久久久久久模特| 久久av二区| 亚洲国产高清高潮精品美女| 亚洲综合国产| 在线观看国产成人av片| 欧美日韩综合视频网址| 欧美亚洲在线视频| 亚洲第一久久影院| 香蕉久久夜色精品国产使用方法 | 欧美国产日韩一区二区在线观看| 一区二区三区视频在线看| 久久影视三级福利片| 一本不卡影院| 狠久久av成人天堂| 欧美体内she精视频在线观看| 欧美在线视频一区二区三区| 亚洲精品中文字幕有码专区| 久久久精品日韩| 亚洲视频一区二区在线观看| 黄色资源网久久资源365| 国产精品久久久久久影院8一贰佰| 欧美一区二区三区四区夜夜大片| 亚洲激情电影中文字幕| 久久久久免费视频| 亚洲欧美激情视频| 日韩视频在线观看| 在线播放国产一区中文字幕剧情欧美| 欧美日韩国产片| 老色鬼精品视频在线观看播放| 亚洲男人第一av网站| 一本色道久久99精品综合| 欧美搞黄网站| 久热精品视频在线观看一区| 亚洲欧美日韩一区二区三区在线观看 | 久久精品国产亚洲aⅴ| 亚洲视频中文字幕| 亚洲美女黄网| 亚洲国产欧美久久| 欧美大片在线观看一区二区| 久久精品在线| 香蕉亚洲视频| 欧美一级大片在线观看| 亚洲专区一区二区三区| 亚洲图色在线| 中文av一区二区| 一本大道久久a久久精品综合| 亚洲日本成人女熟在线观看| 1000精品久久久久久久久| 在线成人激情黄色| 影音先锋亚洲精品| 亚洲成在人线av| 麻豆国产va免费精品高清在线| 欧美在线视频一区| 久久国产一区二区| 久久综合九色99| 欧美成人精品1314www| 女生裸体视频一区二区三区| 欧美成年网站| 欧美精品三区| 国产精品theporn| 国产精品一区二区久久国产| 国产情侣一区| 在线免费观看一区二区三区| 亚洲二区在线| 一区二区三区日韩精品视频| 亚洲网站视频| 欧美在线综合| 免费不卡亚洲欧美| 亚洲精品免费在线| 中文日韩在线| 久久精品国产99国产精品澳门| 久久亚洲欧美| 欧美日韩综合在线免费观看| 国产精品视频导航| 在线电影欧美日韩一区二区私密| 亚洲高清免费在线| 亚洲中字在线| 久久婷婷av| 亚洲毛片播放| 欧美专区日韩视频| 欧美激情亚洲精品| 国产日韩一区在线| 亚洲精品乱码久久久久久黑人 | 亚洲一级高清| 久久综合九色综合欧美就去吻| 欧美激情视频一区二区三区在线播放| 亚洲精品视频在线观看免费| 亚洲男女自偷自拍| 欧美激情一区二区三区在线视频观看 | 欧美黑人在线播放| 国产欧美欧美| 99精品国产在热久久| 午夜视频在线观看一区二区| 欧美.www| 亚洲影院污污.| 欧美bbbxxxxx| 国产一区视频观看| 亚洲午夜精品久久| 欧美激情国产日韩| 欧美一激情一区二区三区| 欧美日本免费| 在线视频欧美一区| 久久躁狠狠躁夜夜爽| 国产精品中文在线| 亚洲视屏一区| 亚洲国产成人午夜在线一区| 久久不射网站| 国产精品女人毛片| 在线亚洲精品|