日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用

發布時間:2023/12/4 asp.net 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

標題:從零開始實現ASP.NET Core MVC的插件式開發(六) - 如何加載插件引用。?

作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11717254.html

源代碼:https://github.com/lamondlu/DynamicPlugins

前景回顧

?????

簡介

在前一篇中,我給大家演示了如何使用.NET Core 3.0中新引入的AssemblyLoadContext來實現運行時升級和刪除插件。完成此篇之后,我得到了很多園友的反饋,很高興有這么多人能夠參與進來,我會根據大家的反饋,來完善這個項目。本篇呢,我將主要解決加載插件引用的問題,這個也是反饋中被問的最多的問題。

問題用例

在之前做的插件中,我們做的都是非常非常簡單的功能,沒有引入任何的第三方庫。但是正常情況下,我們所創建的插件或多或少的都會引用一些第三方庫,那么下面我們來嘗試一下,使用我們先前的項目,加載一個使用第三方程序集, 看看會的得到什么結果。

這里為了模擬,我創建了一個新的類庫項目DemoReferenceLibrary, 并在之前的DemoPlugin1項目中引用DemoReferenceLibrary項目。

在DemoReferenceLibrary中,我新建了一個類Demo.cs文件, 其代碼如下:

public class Demo { public string SayHello() { return "Hello World. Version 1"; } }

這里就是簡單的通過SayHello方法,返回了一個字符串。

然后在DemoPlugin1項目中,我們修改之前創建的Plugin1Controller,從Demo類中通過SayHello方法得到需要在頁面中顯示的字符串。

[Area("DemoPlugin1")] public class Plugin1Controller : Controller { public IActionResult HelloWorld() { var content = new Demo().SayHello(); ViewBag.Content = content; return View(); } }

最后我們打包一下插件,重新將其安裝到系統中,訪問插件路由之后,就會得到以下錯誤。

這里就是大部分同學遇到的問題,無法加載程序集DemoReferenceLibrary。

如何加載插件引用?

這個問題的原因很簡單,就是當通過AssemblyLoadContext加載程序集的時候,我們只加載了插件程序集,沒有加載它引用的程序集。

例如,我們以DemoPlugin1的為例,在這個插件的目錄如下

在這個目錄中,除了我們熟知的DemoPlugin1.dll,DemoPlugin1.Views.dll之外,還有一個DemoReferenceLibrary.dll文件。這個文件我們并沒有在插件啟用時加載到當前的AssemblyLoadContext中,所以在訪問插件路由時,系統找不到這個組件的dll文件。

為什么Mystique.Core.dll、System.Data.SqlClient.dll、Newtonsoft.Json.dll這些DLL不會出現問題呢?

在.NET Core中有2種LoadContext。一種是我們之前介紹的AssemblyLoadContext, 它是一種自定義LoadContext。另外一種就是系統默認的DefaultLoadContext。當一個.NET Core應用啟動的時候,都會創建并引用一個DefaultLoadContext。

如果沒有指定LoadContext, 系統默認會將程序集都加載到DefaultLoadContext中。這里我們可以查看一下我們的主站點項目,這個項目我們也引用了Mystique.Core.dll、System.Data.SqlClient.dll、Newtonsoft.Json.dll。

在.NET Core的設計文檔中,對于程序集加載有這樣一段描述

If the assembly was already present in?A1's?context, either because we had successfully loaded it earlier, or because we failed to load it for some reason, we return the corresponding status (and assembly reference for the success case).

However, if?C1?was not found in?A1's?context, the?Load?method override in?A1's?context is invoked.

?For?Custom LoadContext, this override is an opportunity to load an assembly?before?the fallback (see below) to?Default LoadContext?is attempted to resolve the load.?For?Default LoadContext, this override always returns?null?since?Default Context?cannot override itself.

這里簡單來說,意思就是當在一個自定義LoadContext中加載程序集的時候,如果找不到這個程序集,程序會自動去默認LoadContext中查找,如果默認LoadContext中都找不到,就會返回null。

由此,我們之前的疑問就解決了,這里正是因為主站點已經加載了所需的程序集,雖然在插件的AssemblyLoadContext中找不到這個程序集,程序依然可以通過默認LoadContext來加載程序集。

那么是不是真的就沒有問題了呢?

其實我不是很推薦用以上的方式來加載第三方程序集。主要原因有兩點

?不同插件可以引用不同版本的第三方程序集,可能不同版本的第三方程序集實現不同。而默認LoadContext只能加載一個版本,導致總有一個插件引用該程序集的功能失效。?默認LoadContext中可能加載的第三方程序集與其他插件都不同,導致其他插件功能引用該程序集的功能失效。

所以這里最正確的方式,還是放棄使用默認LoadContext加載程序集,保證每個插件的AssemblyLoadContext都完全加載所需的程序集。

那么如何加載這些第三方程序集呢?我們下面就來介紹兩種方式

?原始方式?使用插件緩存

原始方式

原始方式比較暴力,我們可以選擇加載插件程序集的同時,加載程序集所在目錄中所有的dll文件。

這里首先我們創建了一個插件引用庫加載器接口IReferenceLoader。

public interface IRefenerceLoader { public void LoadStreamsIntoContext(CollectibleAssemblyLoadContext context, string folderName, string excludeFile); }

然后我們創建一個默認的插件引用庫加載器DefaultReferenceLoader,其代碼如下:

public class DefaultReferenceLoader : IRefenerceLoader { public void LoadStreamsIntoContext(CollectibleAssemblyLoadContext context, string folderName, string excludeFile) { var streams = new List<Stream>(); var di = new DirectoryInfo(folderName); var allReferences = di.GetFiles("*.dll").Where(p => p.Name != excludeFile); foreach (var file in allReferences) { using (var sr = new StreamReader(file.OpenRead())) { context.LoadFromStream(sr.BaseStream); } } } }

代碼解釋

?這里我是為了排除當前已經加載插件程序集,所以添加了一個excludeFile參數。?folderName即當前插件的所在目錄,這里我們通過DirectoryInfo類的GetFiles方法,獲取了當前指定folderName目錄中的所有dll文件。?這里我依然通過文件流的方式加載了插件所需的第三方程序集。

完成以上代碼之后,我們還需要修改啟用插件的兩部分代碼

?[MystiqueStartup.cs] - 程序啟動時,注入IReferenceLoader服務,啟用插件?[MvcModuleSetup.cs] - 在插件管理頁面,觸發啟用插件操作

MystiqueStartup.cs

public static void MystiqueSetup(this IServiceCollection services, IConfiguration configuration) { ... services.AddSingleton<IReferenceLoader, DefaultReferenceLoader>(); var mvcBuilder = services.AddMvc(); var provider = services.BuildServiceProvider(); using (var scope = provider.CreateScope()) { ... foreach (var plugin in allEnabledPlugins) { var context = new CollectibleAssemblyLoadContext(); var moduleName = plugin.Name; var filePath = $"{AppDomain.CurrentDomain.BaseDirectory}Modules\\{moduleName}\\{moduleName}.dll"; var referenceFolderPath = $"{AppDomain.CurrentDomain.BaseDirectory}Modules\\{moduleName}"; _presets.Add(filePath); using (var fs = new FileStream(filePath, FileMode.Open)) { var assembly = context.LoadFromStream(fs); loader.LoadStreamsIntoContext(context, referenceFolderPath, $"{moduleName}.dll"); ... } } } ... }

MvcModuleSetup.cs

public void EnableModule(string moduleName) { if (!PluginsLoadContexts.Any(moduleName)) { var context = new CollectibleAssemblyLoadContext(); var filePath = $"{AppDomain.CurrentDomain.BaseDirectory}Modules\\{moduleName}\\{moduleName}.dll"; var referenceFolderPath = $"{AppDomain.CurrentDomain.BaseDirectory}Modules\\{moduleName}"; using (var fs = new FileStream(filePath, FileMode.Open)) { var assembly = context.LoadFromStream(fs); _referenceLoader.LoadStreamsIntoContext(context, referenceFolderPath, $"{moduleName}.dll"); ... } } else { var context = PluginsLoadContexts.GetContext(moduleName); var controllerAssemblyPart = new MystiqueAssemblyPart(context.Assemblies.First()); _partManager.ApplicationParts.Add(controllerAssemblyPart); } ResetControllActions(); }

現在我們重新運行之前的項目,并訪問插件1的路由,你會發現頁面正常顯示了,并且頁面內容也是從DemoReferenceLibrary程序集中加載出來了。

使用插件緩存

原始方式雖然可以幫助我們成功加載插件引用程序集,但是它并不效率,如果插件1和插件2引用了相同的程序集,當插件1的AssemblyLoadContext加載所有的引用程序集之后,插件2會將插件1所干的事情重復一遍。這并不是我們想要的,我們希望如果多個插件同時使用了相同的程序集,就不需要重復讀取dll文件了。

如何避免重復讀取dll文件呢?這里我們可以使用一個靜態字典來緩存文件流信息,從而避免重復讀取dll文件。

如果大家覺著在ASP.NET Core MVC中使用靜態字典來緩存文件流信息不安全,可以改用其他緩存方式,這里只是為了簡單演示。

這里我們首先創建一個引用程序集緩存容器接口IReferenceContainer, 其代碼如下:

public interface IReferenceContainer { List<CachedReferenceItemKey> GetAll(); bool Exist(string name, string version); void SaveStream(string name, string version, Stream stream); Stream GetStream(string name, string version); }

代碼解釋

?GetAll方法會在后續使用,用來獲取系統中加載的所有引用程序集?Exist方法判斷了指定版本程序集的文件流是否存在?SaveStream是將指定版本的程序集文件流保存到靜態字典中?GetStream是從靜態字典中拉取指定版本程序集的文件流

然后我們可以創建一個引用程序集緩存容器的默認實現DefaultReferenceContainer類,其代碼如下:

public class DefaultReferenceContainer : IReferenceContainer { private static Dictionary<CachedReferenceItemKey, Stream> _cachedReferences = new Dictionary<CachedReferenceItemKey, Stream>(); public List<CachedReferenceItemKey> GetAll() { return _cachedReferences.Keys.ToList(); } public bool Exist(string name, string version) { return _cachedReferences.Keys.Any(p => p.ReferenceName == name && p.Version == version); } public void SaveStream(string name, string version, Stream stream) { if (Exist(name, version)) { return; } _cachedReferences.Add(new CachedReferenceItemKey { ReferenceName = name, Version = version }, stream); } public Stream GetStream(string name, string version) { var key = _cachedReferences.Keys.FirstOrDefault(p => p.ReferenceName == name && p.Version == version); if (key != null) { _cachedReferences[key].Position = 0; return _cachedReferences[key]; } return null; } }

這個類比較簡單,我就不做太多解釋了。

完成了引用緩存容器之后,我修改了之前創建的IReferenceLoader接口,及其默認實現DefaultReferenceLoader。

public interface IReferenceLoader { public void LoadStreamsIntoContext(CollectibleAssemblyLoadContext context, string moduleFolder, Assembly assembly); } public class DefaultReferenceLoader : IReferenceLoader { private IReferenceContainer _referenceContainer = null; private readonly ILogger<DefaultReferenceLoader> _logger = null; public DefaultReferenceLoader(IReferenceContainer referenceContainer, ILogger<DefaultReferenceLoader> logger) { _referenceContainer = referenceContainer; _logger = logger; } public void LoadStreamsIntoContext(CollectibleAssemblyLoadContext context, string moduleFolder, Assembly assembly) { var references = assembly.GetReferencedAssemblies(); foreach (var item in references) { var name = item.Name; var version = item.Version.ToString(); var stream = _referenceContainer.GetStream(name, version); if (stream != null) { _logger.LogDebug($"Found the cached reference '{name}' v.{version}"); context.LoadFromStream(stream); } else { if (IsSharedFreamwork(name)) { continue; } var dllName = $"{name}.dll"; var filePath = $"{moduleFolder}\\{dllName}"; if (!File.Exists(filePath)) { _logger.LogWarning($"The package '{dllName}' is missing."); continue; } using (var fs = new FileStream(filePath, FileMode.Open)) { var referenceAssembly = context.LoadFromStream(fs); var memoryStream = new MemoryStream(); fs.Position = 0; fs.CopyTo(memoryStream); fs.Position = 0; memoryStream.Position = 0; _referenceContainer.SaveStream(name, version, memoryStream); LoadStreamsIntoContext(context, moduleFolder, referenceAssembly); } } } } private bool IsSharedFreamwork(string name) { return SharedFrameworkConst.SharedFrameworkDLLs.Contains($"{name}.dll"); } }

代碼解釋:

?這里LoadStreamsIntoContext方法的assembly參數,即當前插件程序集。?這里我通過GetReferencedAssemblies方法,獲取了插件程序集引用的所有程序集。?如果引用程序集在引用容器中不存在,我們就是用文件流加載它,并將其保存到引用容器中, 如果引用程序集已存在于引用容器,就直接加載到當前插件的AssemblyLoadContext中。這里為了檢驗效果,如果程序集來自緩存,我使用日志組件輸出了一條日志。?由于插件引用的程序集,有可能是來自Shared Framework, 這種程序集是不需要加載的,所以這里我選擇跳過這類程序集的加載。(這里我還沒有考慮Self-Contained發布的情況,后續這里可能會更改)

最后我們還是需要修改MystiqueStartup.cs和MvcModuleSetup.cs中啟用插件的代碼。

MystiqueStartup.cs

public static void MystiqueSetup(this IServiceCollection services, IConfiguration configuration) { ... services.AddSingleton<IReferenceContainer, DefaultReferenceContainer>(); services.AddSingleton<IReferenceLoader, DefaultReferenceLoader>(); ... var mvcBuilder = services.AddMvc(); var provider = services.BuildServiceProvider(); using (var scope = provider.CreateScope()) { ... foreach (var plugin in allEnabledPlugins) { ... using (var fs = new FileStream(filePath, FileMode.Open)) { var assembly = context.LoadFromStream(fs); loader.LoadStreamsIntoContext(context, referenceFolderPath, assembly); ... } } } ... }

MvcModuleSetup.cs

public void EnableModule(string moduleName) { if (!PluginsLoadContexts.Any(moduleName)) { ... using (var fs = new FileStream(filePath, FileMode.Open)) { var assembly = context.LoadFromStream(fs); _referenceLoader.LoadStreamsIntoContext(context, referenceFolderPath, assembly); ... } } else { ... } ResetControllActions(); }

完成代碼之后,為了檢驗效果,我創建了另外一個插件DemoPlugin2, 這個項目的代碼和DemoPlugin1基本一樣。程序啟動時,你會發現DemoPlugin2所使用的引用程序集都是從緩存中加載的,而且DemoPlugin2的路由也能正常訪問。

添加頁面來顯示加載的第三方程序集

這里為了顯示一下系統中加載了哪些程序集,我添加了一個新頁面Assembilies, 這個頁面就是調用了IReferenceContainer接口中定義的GetAll方法,顯示了靜態字典中,所有加載的程序集。

效果如下:

幾個測試場景

最后,在編寫完成以上代碼功能之后,我們使用以下幾種場景來測試一下,看一看AssemblyLoadContext為我們提供的強大功能。

場景1

2個插件,一個引用DemoReferenceLibrary的1.0.0.0版本,另外一個引用DemoReferenceLibrary的1.0.1.0版本。其中1.0.0.0版本,SayHello方法返回的字符串是"Hello World. Version 1", 1.0.1.0版本,?SayHello方法返回的字符串是“Hello World. Version 2”。

啟動項目,安裝插件1和插件2,分別運行插件1和插件2的路由,你會得到不同的結果。這說明AssemblyLoadContext為我們做了很好的隔離,插件1和插件2雖然引用了相同插件的不同版本,但是互相之間完全沒有影響。

場景2

當2個插件使用了相同的第三方庫,并加載完成之后,禁用插件1。雖然他們引用的程序集相同,但是你會發現插件2還是能夠正常訪問,這說明插件1的AssemblyLoadContext的釋放,對插件2的AssemblyLoadContext完全沒有影響。

總結

本篇我為大家介紹了如何解決插件引用程序集的加載問題,這里我們講解了兩種方式,原始方式和緩存方式。這兩種方式的最終效果雖然相同,但是緩存方式的效率明顯更高。后續我會根據反饋,繼續添加新內容,大家敬請期待。

前景回顧

?????

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久免费视频在线观看6 | 一本大道久久精品懂色aⅴ 五月婷社区 | 免费国产一区二区 | 99国产精品一区 | 一本一本久久a久久精品综合妖精 | 久草视频在线资源站 | 中文字幕日韩无 | 免费国产亚洲视频 | 久久中文欧美 | 久久免费视频1 | 一级免费黄色 | 九色精品 | 日韩免费一级电影 | 国产免费三级在线观看 | 一本色道久久综合亚洲二区三区 | 天海冀一区二区三区 | 69视频国产 | 欧美a视频| 亚洲综合在线一区二区三区 | 特黄特色特刺激视频免费播放 | 91亚洲网站 | 操操操干干干 | 日韩精品在线一区 | 91精品久久久久久综合乱菊 | 久久伊99综合婷婷久久伊 | 久久久国产精品成人免费 | 中文一二区 | 中文字幕 在线 一 二 | www.香蕉| 久久久精品国产免费观看同学 | 国产精品久久久久久久久久免费看 | 欧洲不卡av| 国产精品va | 国产永久免费高清在线观看视频 | 中文字幕在线观看视频一区二区三区 | 久久成人国产精品一区二区 | 丁香花在线视频观看免费 | av午夜电影 | 国产一区二区三区在线免费观看 | 婷婷综合久久 | 天天爱天天射天天干天天 | 国产精品一级视频 | 97精品一区二区三区 | 欧美了一区在线观看 | 国产高潮久久 | 一区二区精品在线 | 亚洲h在线播放在线观看h | 字幕网av| 日日夜夜天天 | 又大又硬又黄又爽视频在线观看 | 中文字幕精 | 69绿帽绿奴3pvideos | 四虎亚洲精品 | 91在线小视频| 五月婷婷在线视频观看 | 伊人五月| 久久综合狠狠综合久久激情 | 99国产情侣在线播放 | 美女在线免费视频 | 国产精品尤物 | 狠狠色狠狠色 | 国产精品久久久久aaaa | 精品久久1 | 日韩精品中字 | 国产精品视屏 | 超碰在线人人97 | av不卡中文| 久久久www成人免费毛片麻豆 | 国产成人精品一区二区三区 | 国产精品久久久久久久久久尿 | 91在线日本| 成人福利在线播放 | 国产99久久久国产精品免费看 | 不卡的av在线播放 | 国产无区一区二区三麻豆 | 福利视频导航网址 | 久草在线在线 | 亚洲综合网 | 色综合久久久久久久 | 手机在线观看国产精品 | 九九九九九精品 | 麻豆国产视频下载 | 狠狠操天天操 | 999成人| 亚洲免费精彩视频 | 五月婷婷六月丁香 | 在线观看中文 | 香蕉久久久久久av成人 | 天天综合入口 | 夜夜操天天干 | 日韩精品一区不卡 | 国产美女精品视频免费观看 | 伊人婷婷久久 | 国产999精品久久久影片官网 | 日韩在线观看 | 人人玩人人添人人澡97 | 国产精品久久久一区二区三区网站 | 精品久久久久久亚洲综合网 | 成人网在线免费视频 | 国产精品成久久久久三级 | 中文字幕一区二区三区四区久久 | 色婷婷激情电影 | 美女网站在线 | 在线精品播放 | 亚洲91精品在线观看 | 啪啪激情网 | 成人9ⅰ免费影视网站 | 免费精品国产va自在自线 | 国产精品v欧美精品 | 国产在线国偷精品产拍 | 亚洲国产精品va在线 | 五月情婷婷 | 91视频a| 很污的网站 | 久久欧美视频 | 国产中文字幕网 | 91av短视频 | 日本在线成人 | 成人h电影 | 天天综合入口 | 色99之美女主播在线视频 | a一片一级 | 国产一区免费看 | 天天射天天添 | 又爽又黄又无遮挡网站动态图 | 黄色片网站大全 | 丁香六月在线 | 国产精品久久二区 | 日日躁你夜夜躁你av蜜 | 久久玖 | 精品99免费视频 | 男女激情麻豆 | 五月天激情视频 | 在线观看国产www | 黄在线免费观看 | 天天做天天爱天天爽综合网 | 日韩av电影网站在线观看 | 免费视频成人 | 国产福利精品在线观看 | 91精品欧美| 91精品成人 | 96av视频 | 国产精品男女视频 | 欧美三级高清 | 久久免费在线观看视频 | 18性欧美xxxⅹ性满足 | 91插插插免费视频 | 久草在线免费新视频 | 精品国产乱码久久久久久久 | 国产精品 中文字幕 亚洲 欧美 | a极黄色片 | 精品国产三级 | 91精品久久久久久久久久入口 | 久久精品亚洲精品国产欧美 | 韩国av一区| 韩日精品视频 | 久插视频 | 精品久久久久久电影 | 国产精品网站 | 激情综合网色播五月 | 中文字幕在线视频第一页 | 国产成人精品一区二 | 中文字字幕在线 | 久久福利电影 | 欧美日韩成人 | 国产综合精品一区二区三区 | 人人舔人人爽 | 亚洲伦理电影在线 | 国产精品扒开做爽爽的视频 | 国产999精品久久久久久 | 亚洲日韩精品欧美一区二区 | 91成人短视频在线观看 | 韩国在线一区二区 | 亚洲色图27p | 在线小视频你懂得 | 色噜噜狠狠色综合中国 | 婷婷爱五月天 | 国产精品99久久久久久久久 | 在线看一区二区 | 欧美91精品 | 精品国产激情 | 日韩精品在线播放 | 91亚洲激情 | 中文字幕永久在线 | 在线导航av | 久久久久久久久黄色 | 国产中文字幕视频在线观看 | 亚洲成人二区 | 99在线播放 | 一区二区三区四区精品视频 | 精品国产123 | 最近中文字幕完整高清 | 中文字幕第一 | 91在线视频 | 久久免费国产精品 | 日韩在线不卡视频 | 国产精品h在线观看 | 欧美日韩18| 99色免费视频 | 免费麻豆 | 亚洲日韩精品欧美一区二区 | 欧美在线不卡一区 | 视频在线观看入口黄最新永久免费国产 | 奇米影视在线99精品 | av网站大全免费 | 中文字幕色婷婷在线视频 | 国产精品人人做人人爽人人添 | 九九九九精品 | 中文区中文字幕免费看 | 91成人网在线 | 久久精品国产亚洲精品2020 | 99免费在线播放99久久免费 | 菠萝菠萝蜜在线播放 | 日韩免费成人 | 日韩av中文字幕在线免费观看 | 免费观看久久 | 91原创在线观看 | 四川bbb搡bbb爽爽视频 | 欧美激情视频一区二区三区 | 在线亚洲小视频 | 久久观看最新视频 | 在线看黄网站 | 在线观看国产v片 | 精品久久毛片 | 免费在线国产精品 | 99色精品视频 | 日本最大色倩网站www | 日韩视频免费播放 | 成人av免费在线观看 | 69精品| 久久久这里有精品 | 九九九九九国产 | 成人在线观看免费视频 | 久久综合天天 | 国产美女精品视频免费观看 | 婷婷在线视频 | 开心婷婷色 | 国产精品网红直播 | 高清不卡一区二区三区 | 免费看成年人 | 久久国内精品99久久6app | 亚洲欧美精品一区 | 97电影手机版 | 成人国产电影在线观看 | 91精品国产自产在线观看永久 | 99色99| 99热国产在线观看 | 欧美福利久久 | 天堂av在线中文在线 | 黄a在线| 亚洲最新av在线 | 日日干夜夜骑 | 91精品国产91久久久久久三级 | 五月综合色 | 久久精品亚洲国产 | 伊人国产女 | 欧美性色综合 | 伊人www22综合色 | 国产高清免费av | 国产精品久久久久久av | 成人在线免费看视频 | 在线观看福利网站 | 欧美精品中文字幕亚洲专区 | 欧美一区二区在线看 | 99久久精品国产一区二区三区 | 狠狠伊人 | 国产精品手机在线观看 | 欧洲亚洲激情 | 成人精品一区二区三区电影免费 | 亚洲午夜精品一区 | 久久66热这里只有精品 | 特黄特黄的视频 | 日日干美女| 精品久久久久国产免费第一页 | 四虎影视精品永久在线观看 | 特级黄色片免费看 | 91mv.cool在线观看 | 国产无遮挡猛进猛出免费软件 | a在线一区 | 91精品伦理 | 久久精品精品电影网 | 91av视频网站 | 五月天中文字幕mv在线 | 99热精品国产一区二区在线观看 | 日韩亚洲在线视频 | 日韩av电影中文字幕在线观看 | 久久国产免 | 国产高清在线观看 | 字幕网av | 亚洲色图美腿丝袜 | 狠狠操狠狠干2017 | 在线精品在线 | 免费在线观看av的网站 | 国产精品原创视频 | 欧美综合国产 | 亚洲高清在线精品 | 日韩精品一区二区在线观看 | 成人三级视频 | 久久久亚洲国产精品麻豆综合天堂 | 天天插夜夜操 | 在线看毛片网站 | 99中文字幕视频 | 久久伦理电影 | 正在播放五月婷婷狠狠干 | a级一a一级在线观看 | 欧美性生爱| 在线视频麻豆 | 一区 二区 精品 | 精品96久久久久久中文字幕无 | 91视频久久久久 | 91亚洲狠狠婷婷综合久久久 | 日韩午夜三级 | 国产精品九九视频 | 中文字幕丝袜制服 | 中文字幕人成乱码在线观看 | 亚洲视频www | 可以免费看av | 国产视频一区二区在线观看 | 在线观看黄网站 | 日韩av成人在线观看 | 欧美污污网站 | 日韩在线免费电影 | 免费av黄色 | 日韩最新在线视频 | 综合色婷婷 | 国产一区视频在线 | 国产精品视频资源 | 四虎影视成人永久免费观看视频 | 欧美亚洲精品一区 | 久久艹在线 | 国产在线一区二区 | 91中文字幕在线视频 | 成人午夜电影网站 | 午夜成人免费影院 | 中文字幕在线字幕中文 | 黄色三级在线看 | 97看片| 免费日韩av电影 | 黄色的视频 | 日本高清免费中文字幕 | 五月天激情视频 | 国产极品尤物在线 | 西西4444www大胆无视频 | 国产精品一区二区在线看 | 18久久久久久 | 国产精品一区二区三区久久 | 国产美女精品视频 | 成人动漫一区二区三区 | 久草网视频在线观看 | 天天干,天天射,天天操,天天摸 | 国产成人一区二区三区电影 | 精品国产自在精品国产精野外直播 | 久久免费播放视频 | 亚洲乱码精品 | 99在线免费观看视频 | 国产精品亚 | 特黄特色特刺激视频免费播放 | 国产精品黄色影片导航在线观看 | a级国产乱理伦片在线观看 亚洲3级 | 91网址在线| 国产精品自产拍在线观看 | 在线 视频 一区二区 | 日日干,天天干 | 日韩av午夜在线观看 | 成人观看 | 不卡视频在线 | www黄免费| av资源免费在线观看 | 欧美精品v国产精品 | 97精品一区二区三区 | 中国一级片视频 | 午夜视频在线观看一区二区三区 | 久久久999精品视频 国产美女免费观看 | 一区三区在线欧 | 蜜臀av一区| 天天综合网天天综合色 | 日本高清免费中文字幕 | 911精品视频 | 免费av网站在线看 | 久久久久久久福利 | 91成人免费 | 日本精品视频一区 | 麻豆视传媒官网免费观看 | 美女视频久久 | 青青河边草观看完整版高清 | 一区二区三区四区五区在线视频 | 永久免费的啪啪网站免费观看浪潮 | 精品五月天| 又紧又大又爽精品一区二区 | 亚洲高清激情 | 国产99久久 | 日韩欧美在线综合网 | 亚洲综合视频网 | 99视频免费 | 激情综合啪 | 精品免费一区 | 国产免费成人av | 日日麻批40分钟视频免费观看 | 在线观看国产一区二区 | 天堂久久电影网 | 天天射天 | 又爽又黄又刺激的视频 | 中文字幕免费看 | 日本91在线| 亚洲无人区小视频 | 91精品在线观看视频 | 国产免费激情久久 | 操处女逼 | 精品视频免费播放 | 久久久九色精品国产一区二区三区 | 福利网在线 | 成年人在线免费看视频 | 中文字幕你懂的 | 日日干夜夜草 | 中文字幕 在线看 | 国产精品黄色 | 久久天天躁夜夜躁狠狠躁2022 | 日韩爱爱片| 天天射天天添 | 久久精彩免费视频 | 国产成人av| 婷婷激情五月 | 一级黄色大片 | 精品久久中文 | 久久久精品电影 | 国产精品欧美 | 亚洲涩涩涩| 欧美激情精品久久久久久 | 日韩在线不卡 | 色中文字幕在线观看 | 国产二区电影 | 国产小视频网站 | 99热这里只有精品久久 | 夜夜躁日日躁狠狠久久av | 91九色免费视频 | 96亚洲精品久久久蜜桃 | 91九色精品国产 | 爱射综合 | 婷婷色资源 | 99热精品免费观看 | 国产在线精品一区二区不卡了 | 精品女同一区二区三区在线观看 | 国产五月婷婷 | 99久久久久成人国产免费 | 黄色avwww | 欧美精彩视频在线观看 | 91av在线视频免费观看 | 日韩欧美精品在线 | 精品国产欧美一区二区三区不卡 | 久久久久久综合网天天 | 91av色| 亚洲日本一区二区在线 | 最近中文字幕mv | 2019精品手机国产品在线 | 日韩一区二区免费视频 | 九九综合久久 | av线上看| 中文永久免费观看 | 日本精品在线 | 国产又粗又猛又色又黄视频 | 五月开心六月婷婷 | 精品国产成人av | 欧美大片在线观看一区 | 久久久999| 亚洲国产欧美在线看片xxoo | 免费精品 | 天天操天天射天天爽 | 69精品在线 | 激情丁香月| 国产视频中文字幕 | 2021av在线| 在线观看免费黄色 | av高清一区 | 亚洲人在线视频 | 欧美成年网站 | 射久久久| 久久婷婷国产色一区二区三区 | 五月婷亚洲 | 69中文字幕 | 免费激情网 | 免费观看黄色12片一级视频 | 婷婷激情综合网 | 九色视频自拍 | 国产夫妻性生活自拍 | 日本在线视频一区二区三区 | 中文字幕在线免费看 | 久久精品电影网 | 六月色丁香 | 国产三级香港三韩国三级 | 91九色porn在线资源 | 在线观看黄网站 | 成人在线观看av | 国产婷婷在线观看 | 国产精品不卡 | 亚洲 欧洲av | 中文字幕乱码电影 | 国产精品系列在线播放 | www..com黄色片 | 18久久久久久 | 亚洲激情网站免费观看 | 婷婷久久一区 | 国产黄色片免费看 | 亚洲日本韩国一区二区 | 在线观看岛国片 | 九九九九免费视频 | 在线观看日韩视频 | 久章操 | 欧美精品久久99 | 国内精品在线看 | 开心激情综合网 | 91福利在线导航 | 亚洲高清在线观看视频 | 中文字幕日韩伦理 | 日韩色高清 | 亚洲丝袜中文 | 日日干夜夜骑 | 一区三区视频在线观看 | 欧美三人交 | 国外成人在线视频网站 | 欧美最爽乱淫视频播放 | 91免费在线视频 | 五月婷婷激情六月 | 精品一区二区三区久久久 | 亚洲精品在线播放视频 | 国产剧情久久 | 久久99网| 久久在线看 | 欧美久草视频 | 精选久久 | 在线精品亚洲一区二区 | 夜夜干夜夜 | 欧美午夜剧场 | 午夜少妇一区二区三区 | 88av网站| 亚洲一区动漫 | 亚洲色图 校园春色 | 色av资源网| 免费www视频 | 国产又粗又硬又爽视频 | 午夜精品视频一区二区三区在线看 | 午夜12点| 日韩剧情 | 狠狠成人| 狠狠色狠狠色合久久伊人 | 亚洲最新在线 | 成人精品影视 | 久久99久久99精品中文字幕 | 色中色综合| 激情五月婷婷激情 | japanesexxxxfreehd乱熟 | 久久免费视频国产 | 成 人 免费 黄 色 视频 | av中文天堂在线 | 在线观看视频国产 | 亚洲欧洲国产精品 | 欧美成人h版在线观看 | 四虎影视精品永久在线观看 | 国产成人av一区二区三区在线观看 | 日本在线观看视频一区 | 成人在线观看网址 | 免费h精品视频在线播放 | 天天操天天色天天 | 国产麻豆视频网站 | 欧美资源 | 亚洲美女视频在线观看 | 玖草在线观看 | av片一区 | 精品视频在线观看 | 日韩视频免费看 | 欧美国产日韩一区 | 成人国产精品电影 | 五月婷色 | 国产精品日韩在线播放 | 精品自拍sae8—视频 | 国产精品免费不 | 日韩在线一区二区免费 | 国产久草在线 | 日韩av在线免费看 | 亚洲第二色| 午夜精品久久久久久久久久久 | 五月婷婷综合在线视频 | 欧美精品在线观看 | 亚洲二区精品 | 久久99亚洲网美利坚合众国 | 亚洲另类久久 | 国内99视频| 免费观看福利视频 | 九九精品视频在线看 | 免费色婷婷 | 97手机电影网| 久草免费在线观看视频 | 亚洲自拍自偷 | 日韩在线免费小视频 | 97电影手机 | 就要干b | www.com在线观看| 国产免费av一区二区三区 | 国产免费二区 | 国产精品一区久久久久 | 国产黄av| 激情综合色综合久久综合 | 日韩在线国产精品 | 日韩欧在线 | 伊人久久精品久久亚洲一区 | 亚洲激情在线播放 | 国产青草视频在线观看 | av不卡网站| av九九九| 久操视频在线播放 | 九九热精品国产 | 91视频在线免费看 | 国产精品久久久毛片 | 中文字幕在线免费播放 | 久久精品综合视频 | 在线有码中文 | 精品免费视频123区 午夜久久成人 | 国产精品久久久久久久久久直播 | 亚洲免费在线 | 色在线亚洲 | 菠萝菠萝在线精品视频 | 国产丝袜网站 | 菠萝菠萝蜜在线播放 | 狠狠色综合网站久久久久久久 | 免费看一级黄色 | 国产在线高清视频 | 激情av综合 | 超碰99在线 | www色,com| 国产精品一二三 | 深爱五月激情五月 | 毛片一级免费一级 | 亚洲一级免费观看 | 成人97视频一区二区 | japanesexxxhd奶水 91在线精品一区二区 | 欧美日韩中文国产 | 黄色免费大全 | 国产精品欧美久久久久久 | 欧美巨乳波霸 | 一二三区高清 | 亚洲女在线| 99成人在线视频 | 国产97免费 | 成人一区二区在线观看 | 欧美成人a在线 | 久久国产精品久久精品国产演员表 | 视频国产一区二区三区 | 91av视频播放 | 久久国产一二区 | 日韩精品在线视频免费观看 | 四虎成人免费观看 | 精品国产一区二区三区噜噜噜 | 中文在线a√在线 | 天天干天天草天天爽 | 亚洲国产成人久久 | 久久精品一级片 | 国产小视频网站 | 欧美色图亚洲图片 | 久久久国产一区二区三区 | 国产亚洲精品久久19p | 久久久久看片 | 激情在线五月天 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲精品国产精品国自产在线 | 麻豆小视频在线观看 | 97人人澡人人爽人人模亚洲 | 国产精品久久一区二区无卡 | 日韩欧美视频免费看 | 在线视频你懂得 | 黄色中文字幕 | 亚洲精品午夜aaa久久久 | 午夜精品福利一区二区 | 久久久久久久久网站 | av手机版| 国产手机视频在线 | 久久精品99国产精品亚洲最刺激 | 成人在线观看av | 一级国产视频 | 日日爽 | 免费看黄的 | 亚洲精品欧洲精品 | 国产成人一级 | 天天干人人插 | 激情av在线播放 | av中文字幕在线观看网站 | 国产一级二级三级视频 | 亚洲久久视频 | 日韩激情视频在线观看 | 天天天天爽 | a精品视频 | 亚洲 欧美 日韩 综合 | 黄色免费观看网址 | 精品久久美女 | 久久久久网址 | 中文字幕在线免费 | 欧美成人xxxxx | 亚洲国产网站 | 91网在线看 | 久久大视频 | 精品播放 | 狠狠操狠狠干天天操 | 五月婷婷影院 | 999成人国产 | 婷婷色 亚洲 | 亚洲精品中文字幕在线观看 | 国产精彩视频一区二区 | 国产精品第二页 | 日本婷婷色| 九九九热 | 日本aaaa级毛片在线看 | 久久久久久高清 | 久久久黄色免费网站 | 亚洲精品综合在线观看 | 国产日韩在线视频 | 在线电影av| 丁香六月网 | 国产视频首页 | 日韩免费不卡av | 四虎伊人 | 国产一区视频导航 | 精品一区在线看 | 亚洲国产成人精品电影在线观看 | 91精品对白一区国产伦 | 香蕉视频一级 | 欧美成人黄色片 | 精品国产日本 | av福利电影 | 一级全黄毛片 | 99精品欧美一区二区蜜桃免费 | 国产高清av免费在线观看 | 香蕉97视频观看在线观看 | 国产丝袜制服在线 | 欧美91av | 亚洲婷婷网 | 久章草在线 | 91精品小视频 | 日日夜夜艹| 日韩av免费一区 | 亚洲综合色站 | 午夜电影中文字幕 | 婷婷综合成人 | 欧美日韩伦理一区 | 成人av在线影视 | 新版资源中文在线观看 | 99草视频在线观看 | 三级小视频在线观看 | 欧美日韩在线观看一区 | 久久综合天天 | 精品96久久久久久中文字幕无 | 99色资源| 国产一级视频在线 | 日韩激情久久 | 国产精品综合久久久 | 久久久久国产精品厨房 | 久久免费电影网 | 美女黄网站视频免费 | 亚洲精品综合欧美二区变态 | 波多野结衣在线播放视频 | 99久久99视频只有精品 | 亚洲国产精品女人久久久 | 久久精品综合 | 成人av网站在线观看 | www九九热| 国产又粗又长又硬免费视频 | av色综合网 | 久久与婷婷 | 丁香婷婷综合色啪 | 色狠狠一区二区 | 欧美日韩视频免费看 | 狠狠干夜夜爽 | 日韩精品一区二区三区三炮视频 | 在线韩国电影免费观影完整版 | www.午夜色.com | 国产一区二区久久久 | 中文字幕av专区 | 日韩精品专区在线影院重磅 | 精品免费一区二区三区 | 国产精品麻豆91 | 国产精品18久久久久久久网站 | 久久伦理电影网 | 国产视频第二页 | 日韩一区在线播放 | 麻豆视频大全 | 91在线播放综合 | 免费中文字幕在线观看 | 91完整版观看 | 涩涩网站免费 | 国产青春久久久国产毛片 | 国产福利网站 | 亚洲人久久久 | 黄色软件大全网站 | 久久九九国产视频 | 九九视频这里只有精品 | av 一区二区三区四区 | 天天操天天干天天 | 欧美日产一区 | 久久久999| 毛片在线播放网址 | 色悠悠久久综合 | 精品美女在线视频 | 精品国产欧美 | 人人爽人人爽人人爽学生一级 | 中文字幕在线观看免费 | 五月婷婷在线观看 | 亚洲国产小视频在线观看 | 日本少妇视频 | 色婷婷狠狠五月综合天色拍 | 99视频+国产日韩欧美 | 中文字幕久久精品一区 | 天天艹| 天天操综合 | 免费观看日韩av | 色婷婷88av视频一二三区 | 蜜臀av麻豆 | 91大神在线看 | 国产亚洲成人网 | 午夜 免费| bayu135国产精品视频 | 五月激情综合婷婷 | 久久久久久久久久久高潮一区二区 | 国产精品av一区二区 | 国产a高清| 久久久精品国产一区二区电影四季 | 91人人网| 亚洲最大av网 | 国产精品久久久久久吹潮天美传媒 | 深爱婷婷激情 | 国产精品欧美在线 | 久久久久区| 天天操天天干天天操天天干 | 天天天天天天干 | 久久国语露脸国产精品电影 | 特级aaa毛片 | 国产va精品免费观看 | 亚洲精品在线二区 | 久久久国产一区二区三区 | 在线观看视频精品 | 热久久精品在线 | 国产在线播放一区二区三区 | 99精品国产兔费观看久久99 | 黄色影院在线观看 | 亚洲国产中文字幕在线视频综合 | 天天色天天射天天干 | 麻豆一区在线观看 | 精品视频久久 | 亚洲精品在线国产 | av福利在线免费观看 | 久久国产精品免费看 | 日韩首页 | 久99久精品视频免费观看 | 国产亚洲成av人片在线观看桃 | www.久草.com | 深爱婷婷| 成人永久在线 | 91在线资源 | 国产aaa大片| 欧美精品在线观看免费 | 婷婷激情欧美 | 91中文字幕网 | 综合婷婷丁香 | 成人a级大片 | 91精品办公室少妇高潮对白 | 午夜丁香视频在线观看 | 91亚洲精品乱码久久久久久蜜桃 | 成人欧美一区二区三区在线观看 | 99福利片 | 黄色视屏av | 久久黄色免费 | 亚洲成a人片77777潘金莲 | 超薄丝袜一二三区 | 99热在线观看| 日韩理论视频 | 久久久首页 | 国产又黄又爽又猛视频日本 | 久久久三级视频 | 成人国产亚洲 | 插插插色综合 | 天天操天天射天天爽 | 在线影院中文字幕 | 欧美日韩另类在线观看 | 91资源在线视频 | 成人免费av电影 | 狠狠躁夜夜躁人人爽视频 | 欧美亚洲三级 | 日韩精品欧美专区 | 综合久久网| 久久久久国产精品一区 | 日韩视频免费播放 | 国产精品免费观看视频 | 免费三级大片 | 国产五月 | 中文字幕久久亚洲 | 青青色影院 | 日韩欧美在线高清 | 色婷婷久久久 | 久草在线观看视频免费 | 91看片在线 | 99精品国产一区二区三区麻豆 | 九九久久久久99精品 | 亚洲欧美视频 | 国产精品国产三级国产aⅴ9色 | 摸bbb搡bbb搡bbbb| 丁香午夜婷婷 | 国产在线资源 | 国产精品黄网站在线观看 | 丁香花中文在线免费观看 | 超碰夜夜| 亚洲五月综合 | 久久久影视 | 日韩欧美在线影院 | 中文字幕韩在线第一页 | 天天爽夜夜爽精品视频婷婷 | av激情五月 | 97精品国产97久久久久久 | 成人午夜网址 | 国产成人61精品免费看片 | 国产精品18毛片一区二区 | 国产精品网红福利 | 99久久精品无码一区二区毛片 | 午夜av免费看 | 久久人91精品久久久久久不卡 | 亚洲精品久久久久999中文字幕 | 欧美精品国产综合久久 | 久久亚洲人 | 久久精品99国产精品 | 日本一区二区三区视频在线播放 | 草莓视频在线观看免费观看 | 成人资源在线观看 | 国产福利91精品张津瑜 | 欧美中文字幕久久 | 日韩精品一区二区三区高清免费 | 免费看污片 | 国产精品18久久久久久久久久久久 | 91大神电影 | 亚洲最大av在线播放 | 亚洲涩涩一区 | 久久er99热精品一区二区 | 久久精品视频99 | 精品a视频 | 夜夜躁天天躁很躁波 | 蜜桃麻豆www久久囤产精品 | 香蕉视频国产在线 | 中文免费观看 | 91三级在线观看 | 成人91av | 国产精品久久久久一区二区三区共 | 色wwwww| 欧美日韩大片在线观看 | 国产中文字幕在线视频 | 国产在线高清视频 | 国产精品黑丝在线观看 | 日韩电影在线观看一区二区 | 亚洲国产精品资源 | 国产麻豆视频在线观看 | 久久国产美女视频 | 婷婷久月 | 91一区啪爱嗯打偷拍欧美 | 欧美精品久久久久久久久久久 | 九九热在线精品视频 | 永久免费观看视频 | 在线a亚洲视频播放在线观看 | 日韩有色 | 在线免费视频你懂的 | 久久综合九色综合久久久精品综合 | 一级黄色av | 欧美日韩一区三区 | 亚洲婷婷在线视频 | 国产精品欧美在线 | 五月天最新网址 | 久久五月婷婷丁香社区 | 久草视频在线免费看 | 中文字幕超清在线免费 | 天海翼一区二区三区免费 | 日韩久久一区 | 日韩精品高清视频 | 在线色亚洲 | 久久人91精品久久久久久不卡 | 狠狠狠色丁香婷婷综合激情 | 久久久av免费 | 婷婷成人亚洲综合国产xv88 | 日本中文字幕电影在线免费观看 | 久久美女精品 | 精品99免费 | 亚洲自拍偷拍色图 | 在线日韩一区 | 国产中文 | 超碰在线观看av | 91大神一区二区三区 | 国产精品一区二区62 | 亚洲成人av一区二区 | 国产精品视频免费在线观看 | 国产999精品久久久久久麻豆 | 日韩激情小视频 | 国产精品理论在线观看 | 日韩av视屏在线观看 | 91精品综合| 日本韩国欧美在线观看 | 日韩av黄| 成人久久 |