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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目)

發(fā)布時(shí)間:2023/12/4 asp.net 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

默認(rèn)情況下,我們打包 NuGet 包時(shí),目標(biāo)項(xiàng)目安裝我們的 NuGet 包會引用我們生成的庫文件(dll)。除此之外,我們也可以專門做 NuGet 工具包,還可以做 NuGet 源代碼包。然而做源代碼包可能是其中最困難的一種了,目標(biāo)項(xiàng)目安裝完后,這些源碼將直接隨目標(biāo)項(xiàng)目一起編譯。

本文將從零開始,教你制作一個(gè)支持 .NET 各種類型項(xiàng)目的源代碼包。



在開始制作一個(gè)源代碼包之間,建議你提前了解項(xiàng)目文件的一些基本概念:

  • 理解 C# 項(xiàng)目 csproj 文件格式的本質(zhì)和編譯流程

當(dāng)然就算不了解也沒有關(guān)系。跟著本教程你也可以制作出來一個(gè)源代碼包,只不過可能遇到了問題的時(shí)候不容易調(diào)試和解決。


接下來,我們將從零開始制作一個(gè)源代碼包。

我們接下來的將創(chuàng)建一個(gè)完整的解決方案,這個(gè)解決方案包括:

  • 一個(gè)將打包成源代碼包的項(xiàng)目

  • 一個(gè)調(diào)試專用的項(xiàng)目(可選)

  • 一個(gè)測試源代碼包的項(xiàng)目(可選)

  • 像其他 NuGet 包的引用項(xiàng)目一樣,我們需要創(chuàng)建一個(gè)空的項(xiàng)目。不過差別是我們需要創(chuàng)建的是控制臺程序。

    當(dāng)創(chuàng)建好之后,Main?函數(shù)中的所有內(nèi)容都是不需要的,于是我們刪除?Main?函數(shù)中的所有內(nèi)容但保留?Main?函數(shù)。

    這時(shí) Program.cs 中的內(nèi)容如下:

    雙擊創(chuàng)建好的項(xiàng)目的項(xiàng)目,或者右鍵項(xiàng)目 “編輯項(xiàng)目文件”,我們可以編輯此項(xiàng)目的 csproj 文件。

    在這里,我將目標(biāo)框架改成了?net48。實(shí)際上如果我們不制作動態(tài)源代碼生成,那么這里無論填寫什么目標(biāo)框架都不重要。在這篇博客中,我們主要篇幅都會是做靜態(tài)源代碼生成,所以你大可不必關(guān)心這里填什么。

    提示:如果 net48 讓你無法編譯這個(gè)項(xiàng)目,說明你電腦上沒有裝 .NET Framework 4.8 框架,請改成 net473, net472, net471, net47, net462, net 461, net46, net45, netcoreapp3.0, netcoreapp2.1, netcoreapp2.0 中的任何一個(gè)可以讓你編譯通過的目標(biāo)框架即可。

    <Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net48</TargetFramework>
    </PropertyGroup>

    </Project>

    接下來,我們會讓這個(gè)項(xiàng)目像一個(gè) NuGet 包的樣子。當(dāng)然,是 NuGet 源代碼包。

    請?jiān)谀愕捻?xiàng)目當(dāng)中創(chuàng)建這些文件和文件夾:

    - Assets
    - build
    + Package.props
    + Package.targets
    - buildMultiTargeting
    + Package.props
    + Package.targets
    - src
    + Foo.cs
    - tools
    + Program.cs

    在這里,-?號表示文件夾,+?號表示文件。

    Program.cs 是我們一開始就已經(jīng)有的,可以不用管。src 文件夾里的 Foo.cs 是我隨意創(chuàng)建的一個(gè)類,你就想往常創(chuàng)建正常的類文件一樣創(chuàng)建一些類就好了。

    比如我的 Foo.cs 里面的內(nèi)容很簡單:

    using System;

    namespace Walterlv.PackageDemo.SourceCode
    {
    internal class Foo
    {
    public static void Print() => Console.WriteLine("Walterlv is a 逗比.");
    }
    }

    props 和 targets 文件你可能在 Visual Studio 的新建文件的模板中找不到這樣的模板文件。這不重要,你隨便創(chuàng)建一個(gè)文本文件,然后將名稱修改成上面列舉的那樣即可。接下來我們會依次修改這些文件中的所有內(nèi)容,所以無需擔(dān)心模板自動為我們生成了哪些內(nèi)容。

    為了更直觀,我將我的解決方案截圖貼出來,里面包含所有這些文件和文件夾的解釋。

    我特別說明了哪些文件和文件夾是必須存在的,哪些文件和文件夾的名稱一定必須與本文說明的一樣。如果你是以教程的方式閱讀本文,建議所有的文件和文件夾都跟我保持一樣的結(jié)構(gòu)和名稱;如果你已經(jīng)對 NuGet 包的結(jié)構(gòu)有一定了解,那么可自作主張修改一些名稱。

    現(xiàn)在,我們要雙擊項(xiàng)目名稱或者右鍵“編輯項(xiàng)目文件”來編輯項(xiàng)目的 csproj 文件

    我們編輯項(xiàng)目文件的目的,是讓我們前一步創(chuàng)建的項(xiàng)目文件夾結(jié)構(gòu)真正成為 NuGet 包中的文件夾結(jié)構(gòu)。

    <Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net48</TargetFramework>

    <!-- 要求此項(xiàng)目編譯時(shí)要生成一個(gè) NuGet 包。-->
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

    <!-- 這里為了方便,我將 NuGet 包的輸出路徑設(shè)置在了解決方案根目錄的 bin 文件夾下,而不是項(xiàng)目的 bin 文件夾下。-->
    <PackageOutputPath>..\bin\$(Configuration)</PackageOutputPath>

    <!-- 創(chuàng)建 NuGet 包時(shí),項(xiàng)目的輸出文件對應(yīng)到 NuGet 包的 tools 文件夾,這可以避免目標(biāo)項(xiàng)目引用我們的 NuGet 包的輸出文件。
    同時(shí),如果將來我們準(zhǔn)備動態(tài)生成源代碼,而不只是引入靜態(tài)源代碼,還可以有機(jī)會運(yùn)行我們 Program 中的 Main 函數(shù)。-->
    <BuildOutputTargetFolder>tools</BuildOutputTargetFolder>

    <!-- 此包將不會傳遞依賴。意味著如果目標(biāo)項(xiàng)目安裝了此 NuGet 包,那么安裝目標(biāo)項(xiàng)目包的項(xiàng)目不會間接安裝此 NuGet 包。-->
    <DevelopmentDependency>true</DevelopmentDependency>

    <!-- 包的版本號,我們設(shè)成了一個(gè)預(yù)覽版;當(dāng)然你也可以設(shè)置為正式版,即沒有后面的 -alpha 后綴。-->
    <Version>0.1.0-alpha</Version>

    <!-- 設(shè)置包的作者。在上傳到 nuget.org 之后,如果作者名與 nuget.org 上的賬號名相同,其他人瀏覽包是可以直接點(diǎn)擊鏈接看作者頁面。-->
    <Authors>walterlv</Authors>

    <!-- 設(shè)置包的組織名稱。我當(dāng)然寫成我所在的組織 dotnet 職業(yè)技術(shù)學(xué)院啦。-->
    <Company>dotnet-campus</Company>
    </PropertyGroup>

    <!-- 在生成 NuGet 包之前,我們需要將我們項(xiàng)目中的文件夾結(jié)構(gòu)一一映射到 NuGet 包中。-->
    <Target Name="IncludeAllDependencies" BeforeTargets="_GetPackageFiles">
    <ItemGroup>

    <!-- 將 Package.props / Package.targets 文件的名稱在 NuGet 包中改為需要的真正名稱。
    因?yàn)?NuGet 包要自動導(dǎo)入 props 和 targets 文件,要求文件的名稱必須是 包名.props 和 包名.targets;
    然而為了避免我們改包名的時(shí)候還要同步改四個(gè)文件的名稱,所以就在項(xiàng)目文件中動態(tài)生成。-->
    <None Include="Assets\build\Package.props" Pack="True" PackagePath="build\$(PackageId).props" />
    <None Include="Assets\build\Package.targets" Pack="True" PackagePath="build\$(PackageId).targets" />
    <None Include="Assets\buildMultiTargeting\Package.props" Pack="True" PackagePath="buildMultiTargeting\$(PackageId).props" />
    <None Include="Assets\buildMultiTargeting\Package.targets" Pack="True" PackagePath="buildMultiTargeting\$(PackageId).targets" />

    <!-- 我們將 src 目錄中的所有源代碼映射到 NuGet 包中的 src 目錄中。-->
    <None Include="Assets\src\**" Pack="True" PackagePath="src" />

    </ItemGroup>
    </Target>

    </Project>

    接下來,我們將編寫編譯文件 props 和 targets。注意,我們需要寫的是四個(gè)文件的內(nèi)容,不要弄錯了。

    如果我們做好的 NuGet 源碼包被其他項(xiàng)目使用,那么這四個(gè)文件中的其中一對會在目標(biāo)項(xiàng)目被自動導(dǎo)入(Import)。在你理解?理解 C# 項(xiàng)目 csproj 文件格式的本質(zhì)和編譯流程?一文內(nèi)容之前,你可能不明白“導(dǎo)入”是什么意思。但作為從零開始的入門博客,你也不需要真的理解導(dǎo)入是什么意思,只要知道這四個(gè)文件中的代碼將在目標(biāo)項(xiàng)目編譯期間運(yùn)行就好。

    你只需要將下面的代碼拷貝到 buildMultiTargeting 文件夾中的 Package.props 文件即可。注意將包名換成你自己的包名,也就是項(xiàng)目名。

    <Project>

    <PropertyGroup>
    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
    </PropertyGroup>

    <!-- 為了簡單起見,如果導(dǎo)入了這個(gè)文件,那么我們將直接再導(dǎo)入 ..\build\Walterlv.PackageDemo.SourceCode.props 文件。
    注意到了嗎?我們并沒有寫 Package.props,因?yàn)槲覀冊诘谌骄帉戫?xiàng)目文件時(shí)已經(jīng)將這個(gè)文件轉(zhuǎn)換為真實(shí)的包名了。-->
    <Import Project="..\build\Walterlv.PackageDemo.SourceCode.props" />

    </Project>

    你只需要將下面的代碼拷貝到 buildMultiTargeting 文件夾中的 Package.targets 文件即可。注意將包名換成你自己的包名,也就是項(xiàng)目名。

    <Project>

    <PropertyGroup>
    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
    </PropertyGroup>

    <!-- 為了簡單起見,如果導(dǎo)入了這個(gè)文件,那么我們將直接再導(dǎo)入 ..\build\Walterlv.PackageDemo.SourceCode.targets 文件。
    注意到了嗎?我們并沒有寫 Package.targets,因?yàn)槲覀冊诘谌骄帉戫?xiàng)目文件時(shí)已經(jīng)將這個(gè)文件轉(zhuǎn)換為真實(shí)的包名了。-->
    <Import Project="..\build\Walterlv.PackageDemo.SourceCode.targets" />

    </Project>

    下面是 build 文件夾中 Package.props 文件的全部內(nèi)容。可以注意到我們幾乎沒有任何實(shí)質(zhì)性的代碼在里面。即便我們在此文件中還沒有寫任何代碼,依然需要創(chuàng)建這個(gè)文件,因?yàn)楹竺娴谖宀轿覀儗⑻砑痈鼜?fù)雜的代碼時(shí)將再次用到這個(gè)文件完成里面的內(nèi)容。

    現(xiàn)在,保持你的文件中的內(nèi)容與下面一模一樣就好。

    <Project>

    <PropertyGroup>
    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
    </PropertyGroup>

    </Project>

    下面是 build 文件夾中的 Package.targets 文件的全部內(nèi)容。

    我們寫了兩個(gè)編譯目標(biāo),即 Target。_WalterlvDemoEvaluateProperties?沒有指定任何執(zhí)行時(shí)機(jī),但幫我們計(jì)算了兩個(gè)屬性:

    • _WalterlvDemoRoot?即 NuGet 包的根目錄

    • _WalterlvDemoSourceFolder?即 NuGet 包中的源代碼目錄

    另外,我們添加了一個(gè)?Message?任務(wù),用于在編譯期間顯示一條信息,這對于調(diào)試來說非常方便。

    _WalterlvDemoIncludeSourceFiles?這個(gè)編譯目標(biāo)指定在?CoreCompile?之前執(zhí)行,并且執(zhí)行需要依賴于?_WalterlvDemoEvaluateProperties?編譯目標(biāo)。這意味著當(dāng)編譯執(zhí)行到?CoreCompile?步驟時(shí),將在它執(zhí)行之前插入?_WalterlvDemoIncludeSourceFiles?編譯目標(biāo)來執(zhí)行,而?_WalterlvDemoIncludeSourceFiles?依賴于?_WalterlvDemoEvaluateProperties,于是?_WalterlvDemoEvaluateProperties?會插入到更之前執(zhí)行。那么在微觀上來看,這三個(gè)編譯任務(wù)的執(zhí)行順序?qū)⑹?#xff1a;_WalterlvDemoEvaluateProperties?->?_WalterlvDemoIncludeSourceFiles?->?CoreCompile。

    _WalterlvDemoIncludeSourceFiles?中,我們定義了一個(gè)集合?_WalterlvDemoCompile,集合中包含 NuGet 包源代碼文件夾中的所有 .cs 文件。另外,我們又定義了?Compile?集合,將?_WalterlvDemoCompile?集合中的所有內(nèi)容添加到?Compile?集合中。Compile?是 .NET 項(xiàng)目中的一個(gè)已知集合,當(dāng)?CoreCompile?執(zhí)行時(shí),所有?Compile?集合中的文件將參與編譯。注意到我沒有直接將 NuGet 包中的源代碼文件引入到?Compile?集合中,而是經(jīng)過了中轉(zhuǎn)。后面第五步中,你將體會到這樣做的作用。

    我們也添加一個(gè)?Message?任務(wù),用于在編譯期間顯示信息,便于調(diào)試。

    <Project>

    <PropertyGroup>
    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
    </PropertyGroup>

    <Target Name="_WalterlvDemoEvaluateProperties">
    <PropertyGroup>
    <_WalterlvDemoRoot>$(MSBuildThisFileDirectory)..\</_WalterlvDemoRoot>
    <_WalterlvDemoSourceFolder>$(MSBuildThisFileDirectory)..\src\</_WalterlvDemoSourceFolder>
    </PropertyGroup>
    <Message Text="1. 初始化源代碼包的編譯屬性" />
    </Target>

    <!-- 引入 C# 源碼。 -->
    <Target Name="_WalterlvDemoIncludeSourceFiles"
    BeforeTargets="CoreCompile"
    DependsOnTargets="_WalterlvDemoEvaluateProperties">
    <ItemGroup>
    <_WalterlvDemoCompile Include="$(_WalterlvDemoSourceFolder)**\*.cs" />
    <Compile Include="@(_WalterlvDemoCompile)" />
    </ItemGroup>
    <Message Text="2 引入源代碼包中的所有源代碼:@(_WalterlvDemoCompile)" />
    </Target>

    </Project>

    我們剛剛花了很大的篇幅教大家完成 props 和 targets 文件,那么這四個(gè)文件是做什么的呢?

    如果安裝我們源代碼包的項(xiàng)目使用?TargetFramework?屬性寫目標(biāo)框架,那么 NuGet 會自動幫我們導(dǎo)入 build 文件夾中的兩個(gè)編譯文件。如果安裝我們源代碼包的項(xiàng)目使用?TargetFrameworks(注意復(fù)數(shù)形式)屬性寫目標(biāo)框架,那么 NuGet 會自動幫我們導(dǎo)入 buildMultiTargeting 文件夾中的兩個(gè)編譯文件。

    如果你對這個(gè)屬性不熟悉,請回到第一步看我們一開始創(chuàng)建的代碼,你會看到這個(gè)屬性的設(shè)置的。如果還不清楚,請閱讀博客:

    • 讓一個(gè) csproj 項(xiàng)目指定多個(gè)開發(fā)框架

    也許你已經(jīng)從本文拷貝了很多代碼過去了,但直到目前我們還沒有看到這些代碼的任何效果,那么現(xiàn)在我們就可以來看看了。這可算是一個(gè)階段性成果呢!

    先編譯生成一下我們一直在完善的項(xiàng)目,我們就可以在解決方案目錄的?bin\Debug目錄下找到一個(gè) NuGet 包。


    現(xiàn)在,我們要打開這個(gè) NuGet 包看看里面的內(nèi)容。你需要先去應(yīng)用商店下載?NuGet Package Explorer,裝完之后你就可以開始直接雙擊 NuGet 包文件,也就是 nupkg 文件。現(xiàn)在我們雙擊打開看看。

    我們的體驗(yàn)到此為止。如果你希望在真實(shí)的項(xiàng)目當(dāng)中測試,可以閱讀其他博客了解如何在本地測試 NuGet 包。

    截至目前,我們只是在源代碼包中引入了 C# 代碼。如果我們需要加入到源代碼包中的代碼包含 WPF 的 XAML 文件,或者安裝我們源代碼包的目標(biāo)項(xiàng)目包含 WPF 的 XAML 文件,那么這個(gè) NuGet 源代碼包直接會導(dǎo)致無法編譯通過。至于原因,你需要閱讀我的另一篇博客來了解:

    • WPF 程序的編譯過程

    即便你不懂 WPF 程序的編譯過程,你也可以繼續(xù)完成本文的所有內(nèi)容,但可能就不會明白為什么接下來我們要那樣去修改我們之前創(chuàng)建的文件。

    接下來我們將修改這些文件:

    • build 文件夾中的 Package.props 文件

    • build 文件夾中的 Package.targets 文件

    在這個(gè)文件中,我們將新增一個(gè)屬性?ShouldFixNuGetImportingBugForWpfProjects。這是我取的名字,意為“是否應(yīng)該修復(fù) WPF 項(xiàng)目中 NuGet 包自動導(dǎo)入的問題”。

    我做一個(gè)開關(guān)的原因是懷疑我們需要針對 WPF 項(xiàng)目進(jìn)行特殊處理是 WPF 項(xiàng)目自身的 Bug,如果將來 WPF 修復(fù)了這個(gè) Bug,那么我們將可以直接通過此開關(guān)來關(guān)閉我們在這一節(jié)做的特殊處理。另外,后面我們將采用一些特別的手段來調(diào)試我們的 NuGet 源代碼包,在調(diào)試項(xiàng)目中我們也會將這個(gè)屬性設(shè)置為?False?以關(guān)閉 WPF 項(xiàng)目的特殊處理。

    <Project>

    <PropertyGroup>
    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>

    ++ <!-- 當(dāng)生成 WPF 臨時(shí)項(xiàng)目時(shí),不會自動 Import NuGet 中的 props 和 targets 文件,這使得在臨時(shí)項(xiàng)目中你現(xiàn)在看到的整個(gè)文件都不會參與編譯。
    ++ 然而,我們可以通過欺騙的方式在主項(xiàng)目中通過 _GeneratedCodeFiles 集合將需要編譯的文件傳遞到臨時(shí)項(xiàng)目中以間接參與編譯。
    ++ WPF 臨時(shí)項(xiàng)目不會 Import NuGet 中的 props 和 targets 可能是 WPF 的 Bug,也可能是刻意如此。
    ++ 所以我們通過一個(gè)屬性開關(guān) `ShouldFixNuGetImportingBugForWpfProjects` 來決定是否修復(fù)這個(gè)錯誤。-->
    ++ <ShouldFixNuGetImportingBugForWpfProjects Condition=" '$(ShouldFixNuGetImportingBugForWpfProjects)' == '' ">True</ShouldFixNuGetImportingBugForWpfProjects>
    ++ </PropertyGroup>

    </Project>

    請按照下面的差異說明來修改你的 Package.targets 文件。實(shí)際上我們幾乎刪除任何代碼,所以其實(shí)你可以將下面的所有內(nèi)容作為你的新的 Package.targets 中的內(nèi)容。

    <Project>

    <PropertyGroup>
    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
    </PropertyGroup>

    ++ <PropertyGroup>
    ++ <!-- 我們增加了一個(gè)屬性,用于處理 WPF 特殊項(xiàng)目的源代碼之前,確保我們已經(jīng)收集到所有需要引入的源代碼。 -->
    ++ <_WalterlvDemoImportInWpfTempProjectDependsOn>_WalterlvDemoIncludeSourceFiles</_WalterlvDemoImportInWpfTempProjectDependsOn>
    ++ </PropertyGroup>

    <Target Name="_WalterlvDemoEvaluateProperties">
    <PropertyGroup>
    <_WalterlvDemoRoot>$(MSBuildThisFileDirectory)..\</_WalterlvDemoRoot>
    <_WalterlvDemoSourceFolder>$(MSBuildThisFileDirectory)..\src\</_WalterlvDemoSourceFolder>
    </PropertyGroup>
    <Message Text="1. 初始化源代碼包的編譯屬性" />
    </Target>

    <!-- 引入 C# 源碼。 -->
    <Target Name="_WalterlvDemoIncludeSourceFiles"
    BeforeTargets="CoreCompile"
    DependsOnTargets="_WalterlvDemoEvaluateProperties">
    <ItemGroup>
    <_WalterlvDemoCompile Include="$(_WalterlvDemoSourceFolder)**\*.cs" />
    ++ <_WalterlvDemoAllCompile Include="@(_WalterlvDemoCompile)" />
    <Compile Include="@(_WalterlvDemoCompile)" />
    </ItemGroup>
    -- <Message Text="2 引入源代碼包中的所有源代碼:@(_WalterlvDemoCompile)" />
    ++ <Message Text="2.1 引入源代碼包中的所有源代碼:@(_WalterlvDemoCompile)" />
    </Target>

    ++ <!-- 引入 WPF 源碼。 -->
    ++ <Target Name="_WalterlvDemoIncludeWpfFiles"
    ++ BeforeTargets="MarkupCompilePass1"
    ++ DependsOnTargets="_WalterlvDemoEvaluateProperties">
    ++ <ItemGroup>
    ++ <_WalterlvDemoPage Include="$(_WalterlvDemoSourceFolder)**\*.xaml" />
    ++ <Page Include="@(_WalterlvDemoPage)" Link="%(_WalterlvDemoPage.FileName).xaml" />
    ++ </ItemGroup>
    ++ <Message Text="2.2 引用 WPF 相關(guān)源碼:@(_WalterlvDemoPage)" />
    ++ </Target>

    ++ <!-- 當(dāng)生成 WPF 臨時(shí)項(xiàng)目時(shí),不會自動 Import NuGet 中的 props 和 targets 文件,這使得在臨時(shí)項(xiàng)目中你現(xiàn)在看到的整個(gè)文件都不會參與編譯。
    ++ 然而,我們可以通過欺騙的方式在主項(xiàng)目中通過 _GeneratedCodeFiles 集合將需要編譯的文件傳遞到臨時(shí)項(xiàng)目中以間接參與編譯。
    ++ WPF 臨時(shí)項(xiàng)目不會 Import NuGet 中的 props 和 targets 可能是 WPF 的 Bug,也可能是刻意如此。
    ++ 所以我們通過一個(gè)屬性開關(guān) `ShouldFixNuGetImportingBugForWpfProjects` 來決定是否修復(fù)這個(gè)錯誤。-->
    ++ <Target Name="_WalterlvDemoImportInWpfTempProject"
    ++ AfterTargets="MarkupCompilePass1"
    ++ BeforeTargets="GenerateTemporaryTargetAssembly"
    ++ DependsOnTargets="$(_WalterlvDemoImportInWpfTempProjectDependsOn)"
    ++ Condition=" '$(ShouldFixNuGetImportingBugForWpfProjects)' == 'True' ">
    ++ <ItemGroup>
    ++ <_GeneratedCodeFiles Include="@(_WalterlvDemoAllCompile)" />
    ++ </ItemGroup>
    ++ <Message Text="3. 正在欺騙臨時(shí)項(xiàng)目,誤以為此 NuGet 包中的文件是 XAML 編譯后的中間代碼:@(_WalterlvDemoAllCompile)" />
    ++ </Target>

    </Project>

    我們增加了?_WalterlvDemoImportInWpfTempProjectDependsOn?屬性,這個(gè)屬性里面將填寫一個(gè)到多個(gè)編譯目標(biāo)(Target)的名稱(多個(gè)用分號分隔),用于告知?_WalterlvDemoImportInWpfTempProject?這個(gè)編譯目標(biāo)在執(zhí)行之前必須確保執(zhí)行的依賴編譯目標(biāo)。而我們目前的依賴目標(biāo)只有一個(gè),就是?_WalterlvDemoIncludeSourceFiles?這個(gè)引入 C# 源代碼的編譯目標(biāo)。如果你有其他考慮有引入更多 C# 源代碼的編譯目標(biāo),則需要把他們都加上(當(dāng)然本文是不需要的)。為此,我還新增了一個(gè)?_WalterlvDemoAllCompile?集合,如果存在多個(gè)依賴的編譯目標(biāo)會引入 C# 源代碼,則需要像?_WalterlvDemoIncludeSourceFiles一樣,將他們都加入到?Compile?的同時(shí)也加入到?_WalterlvDemoAllCompile?集合中。

    為什么可能有多個(gè)引入 C# 源代碼的編譯目標(biāo)?因?yàn)楸疚奈覀冎豢紤]了引入我們提前準(zhǔn)備好的源代碼放入源代碼包中,而我們提到過可能涉及到動態(tài)生成 C# 源代碼的需求。如果你有一兩個(gè)編譯目標(biāo)會動態(tài)生成一些 C# 源代碼并將其加入到?Compile?集合中,那么請將這個(gè)編譯目標(biāo)的名稱加入到?_WalterlvDemoImportInWpfTempProjectDependsOn?屬性(注意多個(gè)用分號分隔),同時(shí)將集合也引入一份到?_WalterlvDemoAllCompile?中。

    _WalterlvDemoIncludeWpfFiles?這個(gè)編譯目標(biāo)的作用是引入 WPF 的 XAML 文件,這很容易理解,畢竟我們的源代碼中包含 WPF 相關(guān)的文件。

    請?zhí)貏e注意:

  • 我們加了一個(gè)?Link?屬性,并且將其指定為?%(_WalterlvDemoPage.FileName).xaml。這意味著我們會把所有的 XAML 文件都當(dāng)作在項(xiàng)目根目錄中生成,如果你在其他的項(xiàng)目中用到了相對或絕對的 XAML 文件的路徑,這顯然會改變路徑。但是,我們沒有其他的方法來根據(jù) XAML 文件所在的目錄層級來自定指定?Link?屬性讓其在正確的層級上,所以這里才寫死在根目錄中。

    • 如果要解決這個(gè)問題,我們就需要在生成 NuGet 包之前生成此項(xiàng)目中所有 XAML 文件的正確的?Link?屬性(例如改為?Views\%(_WalterlvDemoPage.FileName).xaml),這意味著需要在此項(xiàng)目編譯期間執(zhí)行一段代碼,把 Package.targets 文件中為所有的 XAML 文件生成正確的?Link?屬性。本文暫時(shí)不考慮這個(gè)問題,但你可以參考?dotnet-campus/SourceYard?項(xiàng)目來了解如何動態(tài)生成?Link。

    我們使用了?_WalterlvDemoPage?集合中轉(zhuǎn)地存了 XAML 文件,這是必要的。因?yàn)檫@樣才能正確通過?%?符號獲取到?FileName?屬性。

    而?_WalterlvDemoImportInWpfTempProject?這個(gè)編譯目標(biāo)就不那么好理解了,而這個(gè)也是完美支持 WPF 項(xiàng)目源代碼包的關(guān)鍵編譯目標(biāo)!這個(gè)編譯目標(biāo)指定在?MarkupCompilePass1?之后,GenerateTemporaryTargetAssembly?之前執(zhí)行。GenerateTemporaryTargetAssembly?編譯目標(biāo)的作用是生成一個(gè)臨時(shí)的項(xiàng)目,用于讓 WPF 的 XAML 文件能夠依賴同項(xiàng)目的 .NET 類型而編譯。然而此臨時(shí)項(xiàng)目編譯期間是不會導(dǎo)入任何 NuGet 的 props 或 targets 文件的,這意味著我們特別添加的所有 C# 源代碼在這個(gè)臨時(shí)項(xiàng)目當(dāng)中都是不存在的——如果項(xiàng)目使用到了我們源代碼包中的源代碼,那么必然因?yàn)轭愋筒淮嬖诙鵁o法編譯通過——臨時(shí)項(xiàng)目沒有編譯通過,那么整個(gè)項(xiàng)目也就無法編譯通過。但是,我們通過在?MarkupCompilePass1?和?GenerateTemporaryTargetAssembly?之間將我們源代碼包中的所有源代碼加入到?_GeneratedCodeFiles?集合中,即可將這些文件加入到臨時(shí)項(xiàng)目中一起編譯。而原本?_GeneratedCodeFiles?集合中是什么呢?就是大家熟悉的 XAML 轉(zhuǎn)換而成的?xxx.g.cs?文件。

    現(xiàn)在我們再次編譯這個(gè)項(xiàng)目,你將得到一個(gè)支持 WPF 項(xiàng)目的 NuGet 源代碼包。


    至此,我們已經(jīng)完成了編寫一個(gè) NuGet 源代碼包所需的全部源碼。接下來你可以在項(xiàng)目中添加更多的源代碼,這樣打出來的源代碼包也將包含更多源代碼。由于我們將將 XAML 文件都通過?Link?屬性指定到根目錄了,所以如果你需要添加 XAML 文件,你將只能添加到我們項(xiàng)目中的?Assets\src?目錄下,除非做?dotnet-campus/SourceYard?中類似的動態(tài)?Link?生成的處理,或者在 Package.targets 文件中手工為每一個(gè) XAML 編寫一個(gè)特別的?Link?屬性。

    另外,在不改變我們整體項(xiàng)目結(jié)構(gòu)的情況下,你也可以任意添加 WPF 所需的圖片資源等。但也需要在 Package.targets 中添加額外的?Resource?引用。如果沒有?dotnet-campus/SourceYard?的自動生成代碼,你可能也需要手工編寫?Resource。

    接下來我會貼出更復(fù)雜的代碼,用于處理更復(fù)雜的源代碼包的場景。

    更復(fù)雜源代碼包的項(xiàng)目組織形式會是下面這樣圖這樣:

    我們在 Assets 文件夾中新增了一個(gè) assets 文件夾。由于資源在此項(xiàng)目中的路徑必須和安裝后的目標(biāo)項(xiàng)目中一樣才可以正確用 Uri 的方式使用資源,所以我們在項(xiàng)目文件 csproj 和編譯文件 Package.targets 中都對這兩個(gè)文件設(shè)置了?Link?到同一個(gè)文件夾中,這樣才可以確保兩邊都能正常使用。

    我們在 src 文件夾的不同子文件夾中創(chuàng)建了 XAML 文件。按照我們前面的說法,我們也需要像資源文件一樣正確在 Package.targets 中設(shè)置 Link 才可以確保 Uri 是一致的。注意,我們接下來的源代碼中沒有在項(xiàng)目文件中設(shè)置 Link,原則上也是需要設(shè)置的,就像資源一樣,這樣才可以確保此項(xiàng)目和安裝此 NuGet 包中的目標(biāo)項(xiàng)目具有相同的 XAML Uri。此例子只是因?yàn)闆]有代碼使用到了 XAML 文件的路徑,所以才能得以幸免。

    我們還利用了 tools 文件夾。我們在項(xiàng)目文件的末尾將輸出文件拷貝到了 tools 目錄下,這樣,我們項(xiàng)目的 Assets 文件夾幾乎與最終的 NuGet 包的文件夾結(jié)構(gòu)一模一樣,非常利于調(diào)試。但為了防止將生成的文件上傳到版本管理,我在 tools 中添加了 .gitignore 文件:

    -- <Project Sdk="Microsoft.NET.Sdk">
    ++ <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net48</TargetFramework>
    ++ <UseWpf>True</UseWpf>

    <!-- 要求此項(xiàng)目編譯時(shí)要生成一個(gè) NuGet 包。-->
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

    <!-- 這里為了方便,我將 NuGet 包的輸出路徑設(shè)置在了解決方案根目錄的 bin 文件夾下,而不是項(xiàng)目的 bin 文件夾下。-->
    <PackageOutputPath>..\bin\$(Configuration)</PackageOutputPath>

    <!-- 創(chuàng)建 NuGet 包時(shí),項(xiàng)目的輸出文件對應(yīng)到 NuGet 包的 tools 文件夾,這可以避免目標(biāo)項(xiàng)目引用我們的 NuGet 包的輸出文件。
    同時(shí),如果將來我們準(zhǔn)備動態(tài)生成源代碼,而不只是引入靜態(tài)源代碼,還可以有機(jī)會運(yùn)行我們 Program 中的 Main 函數(shù)。-->
    <BuildOutputTargetFolder>tools</BuildOutputTargetFolder>

    <!-- 此包將不會傳遞依賴。意味著如果目標(biāo)項(xiàng)目安裝了此 NuGet 包,那么安裝目標(biāo)項(xiàng)目包的項(xiàng)目不會間接安裝此 NuGet 包。-->
    <DevelopmentDependency>true</DevelopmentDependency>

    <!-- 包的版本號,我們設(shè)成了一個(gè)預(yù)覽版;當(dāng)然你也可以設(shè)置為正式版,即沒有后面的 -alpha 后綴。-->
    <Version>0.1.0-alpha</Version>

    <!-- 設(shè)置包的作者。在上傳到 nuget.org 之后,如果作者名與 nuget.org 上的賬號名相同,其他人瀏覽包是可以直接點(diǎn)擊鏈接看作者頁面。-->
    <Authors>walterlv</Authors>

    <!-- 設(shè)置包的組織名稱。我當(dāng)然寫成我所在的組織 dotnet 職業(yè)技術(shù)學(xué)院啦。-->
    <Company>dotnet-campus</Company>
    </PropertyGroup>

    ++ <!-- 我們添加的其他資源需要在這里 Link 到一個(gè)統(tǒng)一的目錄下,以便在此項(xiàng)目和安裝 NuGet 包的目標(biāo)項(xiàng)目中可以用同樣的 Uri 使用。 -->
    ++ <ItemGroup>
    ++ <Resource Include="Assets\assets\Icon.ico" Link="Assets\Icon.ico" Visible="False" />
    ++ <Resource Include="Assets\assets\Background.png" Link="Assets\Background.png" Visible="False" />
    ++ </ItemGroup>

    <!-- 在生成 NuGet 包之前,我們需要將我們項(xiàng)目中的文件夾結(jié)構(gòu)一一映射到 NuGet 包中。-->
    <Target Name="IncludeAllDependencies" BeforeTargets="_GetPackageFiles">
    <ItemGroup>

    <!-- 將 Package.props / Package.targets 文件的名稱在 NuGet 包中改為需要的真正名稱。
    因?yàn)?NuGet 包要自動導(dǎo)入 props 和 targets 文件,要求文件的名稱必須是 包名.props 和 包名.targets;
    然而為了避免我們改包名的時(shí)候還要同步改四個(gè)文件的名稱,所以就在項(xiàng)目文件中動態(tài)生成。-->
    <None Include="Assets\build\Package.props" Pack="True" PackagePath="build\$(PackageId).props" />
    <None Include="Assets\build\Package.targets" Pack="True" PackagePath="build\$(PackageId).targets" />
    <None Include="Assets\buildMultiTargeting\Package.props" Pack="True" PackagePath="buildMultiTargeting\$(PackageId).props" />
    <None Include="Assets\buildMultiTargeting\Package.targets" Pack="True" PackagePath="buildMultiTargeting\$(PackageId).targets" />

    <!-- 我們將 src 目錄中的所有源代碼映射到 NuGet 包中的 src 目錄中。-->
    <None Include="Assets\src\**" Pack="True" PackagePath="src" />

    ++ <!-- 我們將 assets 目錄中的所有源代碼映射到 NuGet 包中的 assets 目錄中。-->
    ++ <None Include="Assets\assets\**" Pack="True" PackagePath="assets" />

    </ItemGroup>
    </Target>

    ++ <!-- 在編譯結(jié)束后將生成的可執(zhí)行程序放到 Tools 文件夾中,使得 Assets 文件夾的目錄結(jié)構(gòu)與 NuGet 包非常相似,便于 Sample 項(xiàng)目進(jìn)行及時(shí)的 NuGet 包調(diào)試。 -->
    ++ <Target Name="_WalterlvDemoCopyOutputToDebuggableFolder" AfterTargets="AfterBuild">
    ++ <ItemGroup>
    ++ <_WalterlvDemoToCopiedFiles Include="$(OutputPath)**" />
    ++ </ItemGroup>
    ++ <Copy SourceFiles="@(_WalterlvDemoToCopiedFiles)" DestinationFolder="Assets\tools\$(TargetFramework)" />
    ++ </Target>

    </Project>
    <Project>

    <PropertyGroup>
    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
    </PropertyGroup>

    <PropertyGroup>
    <!-- 我們增加了一個(gè)屬性,用于處理 WPF 特殊項(xiàng)目的源代碼之前,確保我們已經(jīng)收集到所有需要引入的源代碼。 -->
    <_WalterlvDemoImportInWpfTempProjectDependsOn>_WalterlvDemoIncludeSourceFiles</_WalterlvDemoImportInWpfTempProjectDependsOn>
    </PropertyGroup>

    <Target Name="_WalterlvDemoEvaluateProperties">
    <PropertyGroup>
    <_WalterlvDemoRoot>$(MSBuildThisFileDirectory)..\</_WalterlvDemoRoot>
    <_WalterlvDemoSourceFolder>$(MSBuildThisFileDirectory)..\src\</_WalterlvDemoSourceFolder>
    </PropertyGroup>
    <Message Text="1. 初始化源代碼包的編譯屬性" />
    </Target>

    <!-- 引入主要的 C# 源碼。 -->
    <Target Name="_WalterlvDemoIncludeSourceFiles"
    BeforeTargets="CoreCompile"
    DependsOnTargets="_WalterlvDemoEvaluateProperties">
    <ItemGroup>
    <_WalterlvDemoCompile Include="$(_WalterlvDemoSourceFolder)**\*.cs" />
    <_WalterlvDemoAllCompile Include="@(_WalterlvDemoCompile)" />
    <Compile Include="@(_WalterlvDemoCompile)" />
    </ItemGroup>
    <Message Text="2.1 引入源代碼包中的所有源代碼:@(_WalterlvDemoCompile)" />
    </Target>

    <!-- 引入 WPF 源碼。 -->
    <Target Name="_WalterlvDemoIncludeWpfFiles"
    BeforeTargets="MarkupCompilePass1"
    DependsOnTargets="_WalterlvDemoEvaluateProperties">
    <ItemGroup>
    -- <_WalterlvDemoPage Include="$(_WalterlvDemoSourceFolder)**\*.xaml" />
    -- <Page Include="@(_WalterlvDemoPage)" Link="Views\%(_WalterlvDemoPage.FileName).xaml" />
    ++ <_WalterlvDemoRootPage Include="$(_WalterlvDemoSourceFolder)FooView.xaml" />
    ++ <Page Include="@(_WalterlvDemoRootPage)" Link="Views\%(_WalterlvDemoRootPage.FileName).xaml" />
    ++ <_WalterlvDemoThemesPage Include="$(_WalterlvDemoSourceFolder)Themes\Walterlv.Windows.xaml" />
    ++ <Page Include="@(_WalterlvDemoThemesPage)" Link="Views\%(_WalterlvDemoThemesPage.FileName).xaml" />
    ++ <_WalterlvDemoIcoResource Include="$(_WalterlvDemoRoot)assets\*.ico" />
    ++ <_WalterlvDemoPngResource Include="$(_WalterlvDemoRoot)assets\*.png" />
    ++ <Resource Include="@(_WalterlvDemoIcoResource)" Link="assets\%(_WalterlvDemoIcoResource.FileName).ico" />
    ++ <Resource Include="@(_WalterlvDemoPngResource)" Link="assets\%(_WalterlvDemoPngResource.FileName).png" />
    </ItemGroup>
    -- <Message Text="2.2 引用 WPF 相關(guān)源碼:@(_WalterlvDemoPage);@(_WalterlvDemoIcoResource);@(_WalterlvDemoPngResource)" />
    ++ <Message Text="2.2 引用 WPF 相關(guān)源碼:@(_WalterlvDemoRootPage);@(_WalterlvDemoThemesPage);@(_WalterlvDemoIcoResource);@(_WalterlvDemoPngResource)" />
    </Target>

    <!-- 當(dāng)生成 WPF 臨時(shí)項(xiàng)目時(shí),不會自動 Import NuGet 中的 props 和 targets 文件,這使得在臨時(shí)項(xiàng)目中你現(xiàn)在看到的整個(gè)文件都不會參與編譯。
    然而,我們可以通過欺騙的方式在主項(xiàng)目中通過 _GeneratedCodeFiles 集合將需要編譯的文件傳遞到臨時(shí)項(xiàng)目中以間接參與編譯。
    WPF 臨時(shí)項(xiàng)目不會 Import NuGet 中的 props 和 targets 可能是 WPF 的 Bug,也可能是刻意如此。
    所以我們通過一個(gè)屬性開關(guān) `ShouldFixNuGetImportingBugForWpfProjects` 來決定是否修復(fù)這個(gè)錯誤。-->
    <Target Name="_WalterlvDemoImportInWpfTempProject"
    AfterTargets="MarkupCompilePass1"
    BeforeTargets="GenerateTemporaryTargetAssembly"
    DependsOnTargets="$(_WalterlvDemoImportInWpfTempProjectDependsOn)"
    Condition=" '$(ShouldFixNuGetImportingBugForWpfProjects)' == 'True' ">
    <ItemGroup>
    <_GeneratedCodeFiles Include="@(_WalterlvDemoAllCompile)" />
    </ItemGroup>
    <Message Text="3. 正在欺騙臨時(shí)項(xiàng)目,誤以為此 NuGet 包中的文件是 XAML 編譯后的中間代碼:@(_WalterlvDemoAllCompile)" />
    </Target>

    </Project>

    本文涉及到的所有代碼均已開源到:

    • walterlv.demo/Walterlv.PackageDemo at master · walterlv/walterlv.demo


    本文服務(wù)于開源項(xiàng)目 SourceYard,為其提供支持 WPF 項(xiàng)目的解決方案。dotnet-campus/SourceYard: Add a NuGet package only for dll reference? By using dotnetCampus.SourceYard, you can pack a NuGet package with source code. By installing the new source code package, all source codes behaviors just like it is in your project.

    更多制作源代碼包的博客可以閱讀。從簡單到復(fù)雜的順序:

    • 將 .NET Core 項(xiàng)目打一個(gè)最簡單的 NuGet 源碼包,安裝此包就像直接把源碼放進(jìn)項(xiàng)目一樣 - 呂毅

    • Roslyn 如何基于 Microsoft.NET.Sdk 制作源代碼包 - 林德熙

    • 制作通過 NuGet 分發(fā)的源代碼包時(shí),如果目標(biāo)項(xiàng)目是 WPF 則會出現(xiàn)一些問題(探索篇,含解決方案) - 呂毅

    • SourceYard 制作源代碼包 - 林德熙

    原文地址:https://walterlv.com/post/build-source-code-package-for-wpf-projects.html

    .NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?

    總結(jié)

    以上是生活随笔為你收集整理的从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    av不卡在线看| 激情 一区二区 | 91精品视频免费在线观看 | 国产一二区在线观看 | 黄色在线观看免费网站 | 久久伊人免费视频 | 欧美日韩国内在线 | 久久国产露脸精品国产 | 高清国产午夜精品久久久久久 | 婷婷色网址 | 国产 亚洲 欧美 在线 | 国产免费激情久久 | 九色视频网 | 亚洲国产免费 | 亚洲黄色a| 97在线影视 | 九九热视频在线免费观看 | 国产精品久久久久久久久岛 | 激情综合色综合久久 | 麻豆视频在线观看免费 | 色香蕉在线视频 | 黄网站污| 国产精品久久久久久久av电影 | 欧美性精品 | 亚洲精品男女 | www久久久 | 97精品国产91久久久久久 | 91高清不卡| 国内综合精品午夜久久资源 | 日韩在线观看高清 | 久久精品福利 | 少妇精品久久久一区二区免费 | 久久手机在线视频 | 亚洲另类视频在线观看 | 在线直播av | 在线观看日本高清mv视频 | 国产 字幕 制服 中文 在线 | 日韩系列 | 久久久久久亚洲精品 | 精品二区久久 | 91毛片在线观看 | 欧美小视频在线观看 | 日韩高清在线不卡 | 亚洲aⅴ在线 | 亚洲精品黄 | 深爱激情av| 91自拍成人 | 99久免费精品视频在线观看 | 天堂在线视频免费观看 | av+在线播放在线播放 | 国产精品9区 | 成年人在线电影 | 国产精品一区二区美女视频免费看 | 国产精品久久99综合免费观看尤物 | 国产精品你懂的在线观看 | 成人av一级片 | 97av超碰| 久久五月天婷婷 | 九热在线| 国产玖玖精品视频 | 欧美日韩免费一区二区三区 | 99久久精品久久久久久动态片 | 操综合 | 国产一级在线 | 高潮毛片无遮挡高清免费 | 日韩电影在线看 | 国产精品女同一区二区三区久久夜 | 精品一二区 | 中文字幕一区二区三区乱码不卡 | 天天插夜夜操 | 超级碰碰碰免费视频 | 亚洲一级免费电影 | 欧美精品日韩 | 91人人爱 | 五月天婷亚洲天综合网精品偷 | 中文字幕国产一区 | 国内精品久久久久影院日本资源 | 在线最新av | 在线 国产 亚洲 欧美 | 欧美一级在线 | 亚洲日b视频 | 国产一二三区av | 国产精品ⅴa有声小说 | 国产黄色网| 精品一区av | 久久成人午夜 | 超级av在线 | 五月婷婷六月丁香激情 | 中文字幕在线观看1 | 日韩免费视频观看 | 激情视频区 | 亚洲精品男人的天堂 | 狠狠干狠狠艹 | 黄色av高清 | 成人免费在线播放 | 美女免费黄视频网站 | 粉嫩av一区二区三区四区在线观看 | 在线观看日本高清mv视频 | 国产精品美女久久久久久2018 | 久久视频这里有精品 | 中文字幕日韩伦理 | 国产精品白浆 | 国产成人性色生活片 | 96超碰在线 | 91av视频在线免费观看 | 成人在线视频一区 | 一区二区三区四区五区在线视频 | 国产在线 一区二区三区 | 天天弄天天干 | 国产精品视频999 | 国产资源精品在线观看 | 日韩欧美有码在线 | 天天插天天射 | www.天天草 | 亚洲在线国产 | 久爱综合 | 一区二区三区四区五区六区 | 日本中文乱码卡一卡二新区 | 麻豆国产电影 | 国产精品精品 | 18国产精品白浆在线观看免费 | 激情综合亚洲 | 国产成在线观看免费视频 | 免费一级特黄录像 | a午夜电影| 中文字幕在线观 | 国产一级片直播 | 亚洲激情综合 | 不卡av电影在线 | 精品日韩在线 | 偷拍视频一区 | 在线看片91 | 亚洲伊人婷婷 | 国产一级免费电影 | 精品福利国产 | 亚洲va欧洲va国产va不卡 | 91大片网站 | 国产精彩视频一区二区 | 九九视频在线 | 国产精品99久久免费黑人 | 韩日av一区二区 | 久草视频资源 | 香蕉在线视频播放网站 | 久久天天躁夜夜躁狠狠躁2022 | 精品视频9999 | 91视频久久久 | 日韩综合精品 | 国产自产高清不卡 | 久草免费手机视频 | 玖玖在线免费视频 | 91视频在线免费观看 | 精品国产一区二区三区四区vr | 日韩欧美视频在线观看免费 | 国产精品免费不 | 天天精品视频 | 99性视频| 成年人免费av网站 | 五月天开心 | 精品国产成人 | 91精品国自产拍天天拍 | 91伊人久久大香线蕉蜜芽人口 | 又黄又色又爽 | 97综合在线 | 欧美一区二区精美视频 | 美女免费视频一区 | 999毛片| 日韩激情中文字幕 | 人人爽人人爱 | 免费av影视| 欧美成人h版电影 | 91视频在线免费观看 | 九九热免费在线视频 | 四虎永久免费在线观看 | 久久综合色8888 | 国产高清免费在线播放 | 亚洲免费观看在线视频 | 免费大片黄在线 | 国产在线欧美日韩 | av大全在线 | 欧美一级小视频 | 欧美日韩69| 国产大片黄色 | 免费av免费观看 | 免费福利片2019潦草影视午夜 | 午夜色影院 | 亚洲国产精品99久久久久久久久 | 欧美 日韩 国产 中文字幕 | 超碰97人人爱 | 草久中文字幕 | 97超碰在线久草超碰在线观看 | 精品国产1区 | 亚洲最大色 | 精品一二区 | 欧美精品一区二区免费 | 日韩理论片在线观看 | 人人舔人人 | 久久综合久久综合久久综合 | 久久精品日本啪啪涩涩 | 国产爽妇网 | 黄色三级久久 | 中午字幕在线观看 | 激情五月av | 99色婷婷| 久久久在线免费观看 | 亚洲专区视频在线观看 | 开心激情久久 | 国产不卡精品视频 | 97在线免费 | 91在线色| 亚洲禁18久人片 | 亚洲春色奇米影视 | 五月天婷婷狠狠 | 日韩精品中文字幕有码 | 涩涩伊人 | 欧美精品久久久久久久久久白贞 | 高清av免费看 | 久久免费视频播放 | 中文字幕影片免费在线观看 | 国产麻豆精品久久一二三 | 国产视频精品免费播放 | 久久久久久久久久久网站 | 久久嗨| 久久久不卡影院 | av在线中文 | 日韩欧美在线一区二区 | 日韩欧美在线一区 | 国产91探花 | 91色在线观看视频 | 日韩精品在线视频 | 国产精品毛片 | 一区二区三区免费播放 | 日韩羞羞 | 麻豆国产精品视频 | 久久久黄色| 91精品网站在线观看 | 日本精品在线 | 久久伊99综合婷婷久久伊 | 在线99| 少妇自拍av| 免费不卡中文字幕视频 | 精品国产一区二区三区在线 | 中文字幕高清免费日韩视频在线 | 日韩一区精品 | 天天综合网~永久入口 | 精品国产亚洲一区二区麻豆 | 国产精品免费看久久久8精臀av | 97精品一区二区三区 | 久久久久久久福利 | 在线亚洲成人 | 精品一区二区在线免费观看 | 天天综合色网 | 伊人夜夜 | 女人久久久久 | 免费黄色av | 日韩av成人在线 | 人人爽人人爽人人爽 | 欧美日韩精品在线观看视频 | www.伊人网| 黄色精品国产 | 日韩最新中文字幕 | 日日夜夜狠狠操 | 中文字幕精品www乱入免费视频 | 久久免费视频2 | 欧美精品一区在线发布 | 2018亚洲男人天堂 | 国产福利91精品张津瑜 | 97精品国产91久久久久久久 | 天天干天天干天天操 | 丝袜av网站 | 91视频 - x99av| 中文日韩在线视频 | 91欧美在线 | 久久一区二区三区日韩 | 91黄色小视频 | 女人18毛片a级毛片一区二区 | 激情久久久久久久久久久久久久久久 | 丰满少妇在线观看资源站 | 久久九九影院 | 日韩在线免费播放 | 在线一级片 | 久草网首页 | av综合 日韩 | 国产高清成人av | 日韩一级电影在线 | 91成年视频 | 97超碰在线免费观看 | 一区二区三区高清不卡 | 亚洲日本中文字幕在线观看 | 少妇bbw撒尿 | 2000xxx影视| 国产视频资源在线观看 | 日本韩国在线不卡 | 美女搞黄国产视频网站 | 国产亚洲精品久久久久久移动网络 | 亚洲精品动漫久久久久 | 国产免费观看久久黄 | 免费观看第二部31集 | 一本到视频在线观看 | 国产亚洲无 | 午夜精品一区二区三区在线播放 | 国产一区国产精品 | 超碰97在线资源 | 日本中文字幕在线免费观看 | 一区二区三区四区精品 | 久久久亚洲网站 | 五月天综合网站 | 免费成人黄色片 | 在线探花 | www.天天干| 日本久久中文 | 日本视频久久久 | 国产精品女同一区二区三区久久夜 | 中文字幕有码在线观看 | 久久久久免费网站 | 国产精品99久久久久人中文网介绍 | 成人禁用看黄a在线 | www.亚洲黄色| 精品电影一区 | 久久精品视频免费 | www.国产精品 | 东方av在线免费观看 | 久久久久免费精品视频 | 国产精品久久久久久久久软件 | 久久久黄色免费网站 | 婷婷色影院 | 一本一本久久aa综合精品 | 99久久婷婷国产 | 国内精品美女在线观看 | 91麻豆精品国产自产 | 色欧美日韩 | 9999国产精品 | 国产精品久久久久一区 | 91亚洲成人| av女优中文字幕在线观看 | 91色亚洲 | 色婷婷99 | 亚洲精品麻豆视频 | 中文字幕麻豆 | 国产成人一区二区在线观看 | 91亚洲精品国偷拍 | 欧美日韩不卡一区二区三区 | 亚洲国产97在线精品一区 | 精品在线视频观看 | 一区三区视频在线观看 | 深夜免费小视频 | 国产精品久久久久国产精品日日 | 欧美极品xxxxx | 五月天久久精品 | 99久热在线精品 | 欧美国产视频在线 | 亚洲免费一级电影 | 波多野结衣电影久久 | 精品一区二区三区久久久 | 美女黄频在线观看 | 99久久久久久久久 | 久久久免费电影 | 欧美极度另类性三渗透 | 99热在线这里只有精品 | 不卡的av片 | 色综合网 | 色综合天天爱 | 成年人黄色大片在线 | 国产视频1 | 国产小视频在线免费观看 | 国内精品视频在线 | 久久字幕 | 五月婷婷中文网 | 天天射综合网视频 | 国产不卡av在线播放 | 国产生活一级片 | 操天天操 | 日批网站免费观看 | 日本一区二区三区视频在线播放 | 久久色网站 | 高清一区二区三区 | 久草在线资源网 | 欧美一级特黄高清视频 | 日韩大陆欧美高清视频区 | 五月婷婷黄色网 | 久久综合九色欧美综合狠狠 | 四川bbb搡bbb爽爽视频 | 久久久久亚洲精品中文字幕 | 成人黄色毛片 | 日韩在线高清 | 欧美午夜性生活 | 欧美日韩中文在线观看 | 日韩最新av | 国产精品一级视频 | 欧美亚洲成人免费 | 99精品国产一区二区三区麻豆 | 一级大片在线观看 | 天天干天天拍天天操天天拍 | 五月天堂网 | 97视频精品 | 免费观看一区二区 | 夜夜干夜夜 | 亚洲精品乱码久久久久久蜜桃不爽 | 国产黄色成人av | 中文字幕在线观看的网站 | 在线激情小视频 | 91视频亚洲 | 久草资源在线观看 | 精品国产亚洲一区二区麻豆 | 久久爽久久爽久久av东京爽 | 国产成人黄色在线 | 亚洲精品国精品久久99热一 | 国产伦精品一区二区三区无广告 | 六月色丁 | av解说在线 | 国内精品视频在线播放 | 国产午夜三级一区二区三桃花影视 | 97超碰免费在线观看 | 日日干狠狠操 | 最新国产福利 | 久久成人午夜视频 | 久久精品中文字幕 | 超碰在线观看99 | 色五月激情五月 | 精品一区二区av | 久久久亚洲国产精品麻豆综合天堂 | 婷婷看片| 免费观看www视频 | 操老逼免费视频 | 国产视频午夜 | 99精品国产一区二区三区麻豆 | 亚洲黄色小说网址 | 免费日韩 精品中文字幕视频在线 | 成人午夜电影网站 | 免费看国产视频 | 久久久久成人精品免费播放动漫 | 99久久超碰中文字幕伊人 | 久久精品综合网 | 一本到视频在线观看 | 美国av大片 | 精品久久久国产 | www国产亚洲精品久久麻豆 | 国产精品午夜在线观看 | 日日干天天爽 | 狠狠狠狠狠狠狠 | av日韩精品 | 国产精品video | 亚洲 成人 一区 | 日韩在线视频一区二区三区 | 亚洲精品乱码久久久久久蜜桃欧美 | 久久综合九色综合欧美就去吻 | 国产精品一区二区吃奶在线观看 | 日韩精品一区不卡 | 四虎影视成人精品国库在线观看 | 四虎在线观看网址 | 99在线精品视频在线观看 | 在线观看黄色免费视频 | 成人免费共享视频 | 99精品国产99久久久久久福利 | 奇米7777狠狠狠琪琪视频 | 在线黄色观看 | 91精品国产综合久久福利不卡 | 国产成人在线免费观看 | 国产福利91精品一区二区三区 | 超碰国产在线播放 | 久视频在线 | 91精品91| 国产亚州av | 91精品1区 | 日p视频| 成年人电影免费在线观看 | 岛国av在线不卡 | 奇米777777| 草久在线观看视频 | 欧美在线aaa | 在线一区av | 91麻豆精品国产 | 成人中文字幕在线 | 久久一区二| 麻豆mv在线观看 | 91中文字幕一区 | 99在线免费视频 | 操操操人人 | 国产精品久久久av久久久 | 国产成人亚洲在线电影 | 国产精品手机播放 | 亚洲年轻女教师毛茸茸 | 91av免费观看 | 天天操网址| a在线播放 | 日韩美女久久 | 精品视频网站 | 久久人操 | 中文字幕日韩精品有码视频 | 国产精品99久久久久久久久久久久 | 久久9999久久免费精品国产 | 超级碰碰碰视频 | 亚洲综合在线视频 | 一区二区激情 | 亚洲 综合 激情 | 日韩专区中文字幕 | 人人插人人搞 | 91黄色小网站 | 91热精品 | 国产在线色站 | 国产精品不卡在线 | 日韩一区二区免费播放 | 黄色精品网站 | 91精品网站在线观看 | 五月综合久久 | 欧美a√大片| 中文在线资源 | bbbbb女女女女女bbbbb国产 | 综合久久精品 | 中文字幕av全部资源www中文字幕在线观看 | 一级黄色片在线免费看 | 韩日av在线 | 久久综合久久综合九色 | 日批在线看 | 五月花激情 | 麻豆 free xxxx movies hd| 最新中文字幕在线播放 | 久久免费av电影 | 黄色av免费 | 808电影免费观看三年 | 一本一本久久a久久精品综合妖精 | 国产精品成人久久久久 | 欧美一区二视频在线免费观看 | 国产伦理一区二区三区 | 一区二精品 | 69av视频在线观看 | 亚洲视频在线观看免费 | 欧美亚洲国产精品久久高清浪潮 | 天干啦夜天干天干在线线 | 97超碰在 | 天天操夜操 | 久久久久久久国产精品视频 | 国产小视频在线免费观看 | 欧美国产精品久久久久久免费 | 国产亚洲精品精品精品 | 五月黄色 | 久久福利在线 | 亚洲色图美腿丝袜 | 国产精品第一页在线观看 | 亚洲精品在线观看中文字幕 | 久久精品久久精品久久精品 | 在线观看91 | 婷婷网站天天婷婷网站 | 国产高清精 | 婷婷在线网| 欧美va天堂va视频va在线 | 欧美午夜精品久久久久 | 免费在线黄色av | 国产成人av在线 | 成人av在线网| 久久大视频 | 日b黄色片 | 国产精品欧美久久久久久 | 国产黄网在线 | 国产在线观看国语版免费 | av网站免费在线 | 日韩三级一区 | av黄色在线播放 | 在线视频日韩欧美 | 国产一级电影网 | 又爽又黄又无遮挡网站动态图 | 欧美性一级观看 | 免费观看久久久 | 夜夜操天天操 | 99久久久久久 | 婷香五月| 麻豆视频国产在线观看 | 在线播放91| 久久精品123 | 日韩在线欧美在线 | 国产精品一区二区三区在线播放 | 亚洲精品国产免费 | 亚洲国产播放 | 中文字幕国内精品 | www.黄色片网站 | 日日麻批40分钟视频免费观看 | 蜜臀av夜夜澡人人爽人人桃色 | 精品国产乱码一区二区三区在线 | 国产精品一区二区三区四区在线观看 | 成年人黄色免费网站 | 91九色国产在线 | 久青草视频| 久草国产视频 | 亚洲免费永久精品国产 | 日韩一区二区三区在线观看 | 狠狠色狠狠色综合日日92 | 丁香六月国产 | av在线电影播放 | 黄色精品一区二区 | av在线电影免费观看 | 69av视频在线观看 | 在线观看黄色国产 | 特级a老妇做爰全过程 | 性色在线视频 | 欧美日韩亚洲第一 | 天堂av在线免费观看 | 香蕉久久久久久久 | 国产手机视频在线 | 一级一片免费看 | 国产美女精品久久久 | 欧美一区二区三区在线播放 | 日韩中文字幕免费视频 | 一区二区三区在线播放 | 亚洲涩涩色 | 99久久电影| 欧美日韩高清一区二区 国产亚洲免费看 | 亚洲黄色区 | 中国精品一区二区 | 欧美激情精品久久久 | 美女视频一区 | 久久精品人人做人人综合老师 | 国产亚洲视频在线观看 | 久久久久久国产精品 | 激情av一区二区 | 亚洲深爱激情 | www.com久久久 | 久久久亚洲麻豆日韩精品一区三区 | 精品国产一区二区三区av性色 | 黄色av网站在线免费观看 | 高清在线观看av | 亚洲精品伦理在线 | 九九免费在线观看 | 在线视频 91| 国产精品wwwwww | 麻豆91精品91久久久 | 欧美另类色图 | 国产精品福利在线播放 | 9ⅰ精品久久久久久久久中文字幕 | 国产小视频网站 | 中文字幕激情 | 日韩欧美电影网 | 人人草网站 | 国产高清av | 国产99久久久精品视频 | 天堂av免费看 | 久草在线手机视频 | 中文字幕在线视频第一页 | 麻豆激情电影 | 麻豆91在线播放 | 欧美极品一区二区三区 | 麻豆免费视频网站 | 超碰97中文 | 欧美精品视 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 中文字幕五区 | 操久久网| 国产又粗又猛又色又黄视频 | 久久久久女教师免费一区 | 久久精品电影院 | 91毛片在线| 成人毛片在线视频 | 91成人免费视频 | 最新99热 | 中文字幕在线一二 | 五月婷婷色播 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 国产精品久久久777 成人手机在线视频 | 就要色综合 | 999久久国精品免费观看网站 | 日本久久久影视 | 麻豆一区二区 | 天天综合色 | 在线观看的av网站 | 96av在线| 国产成人av一区二区三区在线观看 | 国产亚洲成人精品 | 国产精品久久久久久久午夜 | 中文国产成人精品久久一 | 久产久精国产品 | 99免在线观看免费视频高清 | 国产3p视频| 中文字幕在线看视频国产中文版 | 欧美性生活免费看 | 国产一卡二卡在线 | 精品欧美一区二区在线观看 | 国产一区视频在线观看免费 | 99精品欧美一区二区三区黑人哦 | 国产精品mv | 五月婷婷中文 | 综合久久久久久久久 | 在线观看片| 精品国产一区二区三区不卡 | 又黄又爽免费视频 | 成人av一级片 | 精品亚洲欧美一区 | 一区精品在线 | 国产成人一区二区啪在线观看 | 日日夜日日干 | 97精品超碰一区二区三区 | 成人精品国产 | 成人在线播放网站 | 午夜久久网站 | 日韩欧美一级二级 | 人交video另类hd| 亚洲专区视频在线观看 | 亚洲欧美视频在线播放 | 久久高清免费视频 | 日韩字幕 | 伊人射 | 成人免费在线观看入口 | 人人爽人人爽人人 | 黄色国产成人 | 成人国产网址 | 丁香婷婷深情五月亚洲 | 国产精品免费久久久久久久久久中文 | 日韩理论电影在线观看 | 天天噜天天色 | 精品美女在线视频 | 97视频资源| 日韩欧美精品在线 | 久久久在线视频 | 久久综合狠狠综合久久激情 | 国产精品 久久 | 欧美一级小视频 | 波多野结衣精品视频 | 最新国产精品拍自在线播放 | 久久伊99综合婷婷久久伊 | 青青草国产精品视频 | 一区二区三区手机在线观看 | 最近最新最好看中文视频 | 国产精品video爽爽爽爽 | 亚洲精品视频在线免费 | 亚洲欧美国产精品18p | 国产成人三级在线播放 | 国产精品久久网站 | 日本精品视频在线观看 | 亚洲视频在线免费观看 | 精品国产91亚洲一区二区三区www | 日韩网站在线免费观看 | 日日天天av | 欧美日韩久久不卡 | 国产xxxx | 黄色最新网址 | 久久高清毛片 | 97在线看片 | 超碰免费久久 | 久久久久久久久亚洲精品 | 亚洲精品乱码久久久久v最新版 | 又黄又爽又无遮挡免费的网站 | 视频国产精品 | 亚洲精品视频在线观看视频 | av免费成人 | 日韩mv欧美mv国产精品 | 欧美国产不卡 | 91精品啪在线观看国产线免费 | 日本天天操| 久久久精品日本 | 日韩激情影院 | 粉嫩av一区二区三区四区 | 国产一区二区在线观看视频 | 狠狠狠色丁香婷婷综合久久五月 | 久久99国产精品视频 | 日韩视频免费看 | 精品视频在线视频 | 五月婷婷六月丁香在线观看 | 国产成人99av超碰超爽 | 亚洲狠狠婷婷综合久久久 | 国产免费不卡 | 大胆欧美gogo免费视频一二区 | 人人干人人草 | 欧美色操| 97精品国产97久久久久久久久久久久 | 欧美日韩一区久久 | 亚洲精品乱码久久久久久久久久 | 色视频网站免费观看 | 96国产精品| 国产精品久久久久久久久久久免费 | av三级在线免费观看 | 国产免费片 | 欧美aⅴ在线观看 | 欧美 日韩精品 | 天天干,天天草 | 一级a性色生活片久久毛片波多野 | 992tv在线观看网站 | 欧美无极色 | 天天操欧美| 午夜影院一级 | 九九九九免费视频 | 日韩免费三级 | 亚洲精品在线观看视频 | 日韩在线免费看 | 97超碰精品| 天天激情 | 激情网综合 | 欧美一二区在线 | 国产精品久久久久久久久久妇女 | 超碰97中文 | 在线观看免费视频你懂的 | 一区二区三区四区久久 | 国产精品第一视频 | 99在线视频播放 | 久久国产精品久久精品 | 天天射色综合 | 国产精品第一页在线 | 午夜的福利 | 色婷婷激情综合 | 人人爽人人爽 | 日韩一级网站 | 亚洲一区二区黄色 | 欧美日韩另类在线 | 韩国av免费看| 在线观看精品 | 国产精品久久久久久久av电影 | 亚洲国产精品激情在线观看 | 在线观看黄色免费视频 | 色婷五月天 | 久草在线视频国产 | 国内精品毛片 | 成人久久视频 | 婷婷日| 日日综合 | 久久久久久久久久久精 | 人人爽久久涩噜噜噜网站 | 黄色av网站在线观看免费 | 视频二区在线 | 国产在线第三页 | 久久久久久久久福利 | 日韩国产欧美视频 | 日韩在线无 | 国产精品你懂的在线观看 | 一区二区精品视频 | 国内精品视频在线播放 | 久久草在线免费 | 久久免费黄色大片 | 91免费试看| 欧美日韩精品影院 | 亚洲 欧洲 国产 精品 | 亚洲va在线va天堂va偷拍 | 五月婷婷伊人网 | 欧美巨大| 国产一区二区高清不卡 | 99热这里只有精品在线观看 | 亚洲欧美日韩国产一区二区三区 | 欧美日韩中文字幕在线视频 | 亚洲国产欧美一区二区三区丁香婷 | 最新超碰 | 92精品国产成人观看免费 | 成人毛片100免费观看 | 69久久99精品久久久久婷婷 | 欧美国产一区在线 | 午夜精品久久久久久久99 | 一区二区三区免费在线观看视频 | 又长又大又黑又粗欧美 | 五月av在线 | 久久久999精品视频 国产美女免费观看 | 国产精品少妇 | 中文在线免费观看 | 欧美先锋影音 | 久草网在线观看 | 久久人人爽人人爽 | bbw av| 九九热re| 久久久久久久久久久久电影 | 91久草视频| 91在线网址| 亚州精品天堂中文字幕 | 久99久在线 | 日韩av快播电影网 | 99精品在线免费视频 | 日韩精品在线播放 | 亚洲日日夜夜 | 一区二区三区电影 | 97超碰在线久草超碰在线观看 | 国产精品久久久久永久免费观看 | 欧美天天综合 | 在线观看你懂的网站 | www夜夜操com | 国产成人免费在线观看 | 免费在线激情电影 | 亚洲国产精品免费 | 五月激情在线 | 九九热在线观看 | 久久免费视频一区 | 这里只有精品视频在线 | 操处女逼 | 黄色片软件网站 | 在线观看黄色大片 | 日本资源中文字幕在线 | 激情视频一区二区三区 | 日本中文一区二区 | 黄色在线观看免费网站 | 久久午夜精品影院一区 | 狠狠色狠狠色终合网 | 日韩欧美69 | 国产日韩欧美在线一区 | 丁香激情综合久久伊人久久 | 国产又粗又长又硬免费视频 | 91精品久久香蕉国产线看观看 | 免费网站观看www在线观看 | 久草视频国产 | 久久久久北条麻妃免费看 | 九九热免费视频在线观看 | 国精产品满18岁在线 | 中文字幕在线观看免费高清完整版 | 六月色 | 久久9999久久免费精品国产 | 在线播放国产精品 | 久久人人艹| 国产97av | 五月天.com | 婷婷www | 97视频中文字幕 | 日本黄色免费电影网站 | 国产成人在线一区 | 亚洲综合导航 | 国产高清av免费在线观看 | 一区二区三区精品久久久 | 婷婷丁香激情网 | 国产午夜三级一二三区 | 在线电影日韩 | 亚洲精品av中文字幕在线在线 | 看国产黄色片 | 欧美看片 | 国产福利中文字幕 | 精品国产美女在线 | 国产精品免费久久久久 | 久章草在线观看 | 日韩中文在线视频 | 久久久免费精品视频 | 九九在线视频免费观看 | 香蕉久久久久久av成人 | 国产 日韩 欧美 在线 | 午夜视频日本 | 久久久久久久久久伊人 | 婷婷色在线播放 | 十八岁免进欧美 | 国产日产高清dvd碟片 | 国产一区国产二区在线观看 | 日韩精品电影在线播放 | 欧美特一级片 | 国产一级片观看 | 久久9精品| 免费在线观看毛片网站 | 久久久五月天 | 99精品偷拍视频一区二区三区 | 9999亚洲 | 久色婷婷 | 97精品国产97久久久久久春色 | 国内精品美女在线观看 | 成年人国产精品 | 久久99久久久久久 | 狠狠综合网 | 亚洲日本成人 | 欧美一级小视频 | 国产精品亚 | 在线视频区 | 国产剧情在线一区 | 国产精品毛片久久久久久久 | 99精品在线免费观看 | 96亚洲精品久久 | 久久呀| 91中文字幕在线 | 日韩在线免费观看视频 | 99国产视频在线 | 日韩系列在线 | 成年人免费在线观看网站 | 99久久久久久久久久 | 国产不卡在线看 | 国产精品久久久久久一区二区 | 国产一级大片在线观看 | 国产在线观看你懂得 | 91精品网站 | 一区二区中文字幕在线观看 | 久久综合狠狠综合久久综合88 | 美国av大片 | 日韩 | 国产一及片 | 日韩视频在线不卡 | 超碰在线观看99 | 午夜久久福利视频 | 天天射天天射天天射 | 欧美男男tv网站 | 国产视频一区二区在线播放 | 91手机电视 | 国产一二三四在线观看视频 | a视频在线播放 | 久久天天躁狠狠躁夜夜不卡公司 | 久久成人国产精品免费软件 | 波多野结衣在线播放一区 | 亚洲成av| 久久人人爽人人爽人人片av免费 | 国产69久久久 | 韩国三级在线一区 | 中文字幕在线色 | 欧美亚洲一区二区在线 | 色综合咪咪久久网 | 91av在线电影| 99久e精品热线免费 99国产精品久久久久久久久久 | 久久久精品国产免费观看同学 | 久久久网址 | 国内精品久久久久影院日本资源 | 日女人电影| 成人免费一级 | 激情网婷婷 | 国产精品视频内 | 天天摸天天操天天爽 | 欧美精品网站 | 成年人视频免费在线 | 热99在线 |