<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      zyl910

      優化技巧、硬件體系、圖像處理、圖形學、游戲編程、國際化與文本信息處理。

        博客園 :: 首頁 :: 博問 :: 閃存 :: 新隨筆 :: 聯系 :: 訂閱 訂閱 :: 管理 ::

      作者: zyl910

      一、緣由

      當創建 .NET Core/Standard 2.0項目時,VS不會像.NET Framework項目一樣自動生成AssemblyInfo.cs文件。
      而且,若是手工在項目中加入以前寫好的 AssemblyInfo.cs 文件,編譯時會報告“CS0579: Duplicate 'AssemblyFileVersionAttribute' attribute”錯誤。

      查了一下資料,發現是因為“.NET Core/Standard 2.0會自動填寫程序集信息”而引起的。
      具體來說——

      1. .NET Core/Standard 2.0 推薦在項目屬性的“Package”頁配置程序集的 版本、描述 等信息。
      2. 編譯時,會自動根據“Package”頁的配置,生成 “<項目名>.AssemblyInfo.cs”。其中便使用了 AssemblyFileVersionAttribute 等特性。
      3. 我們的 AssemblyInfo.cs 中也使用 AssemblyFileVersionAttribute 等特性。因為 AssemblyFileVersionAttribute 等特性是不允許重復,于是便報出CS0579錯誤了。

      ProjectPackage

      刪除自己的 AssemblyInfo.cs,完全使用推薦做法(項目屬性的“Package”頁),當然是可以解決該問題、使項目能成功編譯的。但是該方案的缺點是沒有AssemblyInfo.cs,無法再用“利用條件編譯控制程序集特性”等技巧。
      第二種辦法是在 AssemblyInfo.cs 中加上條件編譯,若發現是 .NET Core/Standard 2.0(#if NETCOREAPP2_0 || NETSTANDARD2_0)時,便屏蔽掉 AssemblyFileVersionAttribute 等特性。但該方法比較繁瑣。

      有沒有辦法“禁止自動生成程序集特性,完全使用自己的AssemblyInfo.cs”呢?

      二、解決

      查了一下資料,找到了“.NET Core/Standard 2.0 禁止自動生成程序集特性”的辦法。就是——修改項目的csproj文件,在PropertyGroup節點內加上“false

      例如修改前是這樣的——

      <Project Sdk="Microsoft.NET.Sdk">
      
        <PropertyGroup>
          <OutputType>Exe</OutputType>
          <TargetFramework>netcoreapp2.0</TargetFramework>
          <AssemblyName>ConsoleExample</AssemblyName>
          <RootNamespace>ConsoleExample</RootNamespace>
        </PropertyGroup>
      
      </Project>
      

      修改后變為這樣——

      <Project Sdk="Microsoft.NET.Sdk">
      
        <PropertyGroup>
          <OutputType>Exe</OutputType>
          <TargetFramework>netcoreapp2.0</TargetFramework>
          <AssemblyName>ConsoleExample</AssemblyName>
          <RootNamespace>ConsoleExample</RootNamespace>
          <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
        </PropertyGroup>
      
      </Project>
      

      改好后便會發現不再自動生成 “<項目名>.AssemblyInfo.cs”了,能使用自己的AssemblyInfo.cs,順利編譯了。

      三、深入

      3.1 自動生成的機制

      “<項目名>.AssemblyInfo.cs”的內容一般是這樣的——

      //------------------------------------------------------------------------------
      // <auto-generated>
      //     This code was generated by a tool.
      //     Runtime Version:4.0.30319.42000
      //
      //     Changes to this file may cause incorrect behavior and will be lost if
      //     the code is regenerated.
      // </auto-generated>
      //------------------------------------------------------------------------------
      using System;
      using System.Reflection;
      [assembly: System.Reflection.AssemblyCompanyAttribute("ConsoleExample")]
      [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
      [assembly: System.Reflection.AssemblyDescriptionAttribute("Package Description")]
      [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
      [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
      [assembly: System.Reflection.AssemblyProductAttribute("ConsoleExample")]
      [assembly: System.Reflection.AssemblyTitleAttribute("ConsoleExample")]
      [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
      // Generated by the MSBuild WriteCodeFragment class.
      

      上面這段自動生成的代碼,實際上是由 c:\Program Files\dotnet\sdk\2.0.0\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.GenerateAssemblyInfo.targets 控制的。該文件的內容是——

      <!--
      ***********************************************************************************************
      Microsoft.NET.GenerateAssemblyInfo.targets
      
      WARNING:  DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
                created a backup copy.  Incorrect changes to this file will make it
                impossible to load or build your projects from the command-line or the IDE.
      
      Copyright (c) .NET Foundation. All rights reserved. 
      ***********************************************************************************************
      -->
      <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <!--
          ============================================================
                                          GenerateAssemblyInfo
      
          Generates assembly info source to intermediate directory
          ============================================================
          -->
        <PropertyGroup>
          <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
          <GeneratedAssemblyInfoFile Condition="'$(GeneratedAssemblyInfoFile)' ==''">$(IntermediateOutputPath)$(MSBuildProjectName).AssemblyInfo$(DefaultLanguageSourceExtension)</GeneratedAssemblyInfoFile>
          <GenerateAssemblyInfo Condition="'$(GenerateAssemblyInfo)' == ''">true</GenerateAssemblyInfo>
        </PropertyGroup>
      
        <PropertyGroup Condition="'$(GenerateAssemblyInfo)' == 'true'">
          <GenerateAssemblyCompanyAttribute Condition="'$(GenerateAssemblyCompanyAttribute)' == ''">true</GenerateAssemblyCompanyAttribute>
          <GenerateAssemblyConfigurationAttribute Condition="'$(GenerateAssemblyConfigurationAttribute)' == ''">true</GenerateAssemblyConfigurationAttribute>
          <GenerateAssemblyCopyrightAttribute Condition="'$(GenerateAssemblyCopyrightAttribute)' == ''">true</GenerateAssemblyCopyrightAttribute>
          <GenerateAssemblyDescriptionAttribute Condition="'$(GenerateAssemblyDescriptionAttribute)' == ''">true</GenerateAssemblyDescriptionAttribute>
          <GenerateAssemblyFileVersionAttribute Condition="'$(GenerateAssemblyFileVersionAttribute)' == ''">true</GenerateAssemblyFileVersionAttribute>
          <GenerateAssemblyInformationalVersionAttribute Condition="'$(GenerateAssemblyInformationalVersionAttribute)' == ''">true</GenerateAssemblyInformationalVersionAttribute>
          <GenerateAssemblyProductAttribute Condition="'$(GenerateAssemblyProductAttribute)' == ''">true</GenerateAssemblyProductAttribute>
          <GenerateAssemblyTitleAttribute Condition="'$(GenerateAssemblyTitleAttribute)' == ''">true</GenerateAssemblyTitleAttribute>
          <GenerateAssemblyVersionAttribute Condition="'$(GenerateAssemblyVersionAttribute)' == ''">true</GenerateAssemblyVersionAttribute>
          <GenerateNeutralResourcesLanguageAttribute Condition="'$(GenerateNeutralResourcesLanguageAttribute)' == ''">true</GenerateNeutralResourcesLanguageAttribute>
        </PropertyGroup>
      
        <!-- 
          Note that this must run before every invocation of CoreCompile to ensure that all compiler
          runs see the generated assembly info. There is at least one scenario involving Xaml 
          where CoreCompile is invoked without other potential hooks such as Compile or CoreBuild,
          etc., so we hook directly on to CoreCompile. Furthermore, we  must run *after* 
          PrepareForBuild to ensure that the intermediate directory has been created.
        -->
        <Target Name="GenerateAssemblyInfo"
                BeforeTargets="CoreCompile"
                DependsOnTargets="PrepareForBuild;CoreGenerateAssemblyInfo"
                Condition="'$(GenerateAssemblyInfo)' == 'true'" />
      
        <Target Name="GetAssemblyAttributes"
                DependsOnTargets="GetAssemblyVersion">
          <ItemGroup>
            <AssemblyAttribute Include="System.Reflection.AssemblyCompanyAttribute" Condition="'$(Company)' != '' and '$(GenerateAssemblyCompanyAttribute)' == 'true'">
              <_Parameter1>$(Company)</_Parameter1>
            </AssemblyAttribute>
            <AssemblyAttribute Include="System.Reflection.AssemblyConfigurationAttribute" Condition="'$(Configuration)' != '' and '$(GenerateAssemblyConfigurationAttribute)' == 'true'">
              <_Parameter1>$(Configuration)</_Parameter1>
            </AssemblyAttribute>
            <AssemblyAttribute Include="System.Reflection.AssemblyCopyrightAttribute" Condition="'$(Copyright)' != '' and '$(GenerateAssemblyCopyrightAttribute)' == 'true'">
              <_Parameter1>$(Copyright)</_Parameter1>
            </AssemblyAttribute>
            <AssemblyAttribute Include="System.Reflection.AssemblyDescriptionAttribute" Condition="'$(Description)' != '' and '$(GenerateAssemblyDescriptionAttribute)' == 'true'">
              <_Parameter1>$(Description)</_Parameter1>
            </AssemblyAttribute>
            <AssemblyAttribute Include="System.Reflection.AssemblyFileVersionAttribute" Condition="'$(FileVersion)' != '' and '$(GenerateAssemblyFileVersionAttribute)' == 'true'">
              <_Parameter1>$(FileVersion)</_Parameter1>
            </AssemblyAttribute>
            <AssemblyAttribute Include="System.Reflection.AssemblyInformationalVersionAttribute" Condition="'$(InformationalVersion)' != '' and '$(GenerateAssemblyInformationalVersionAttribute)' == 'true'">
              <_Parameter1>$(InformationalVersion)</_Parameter1>
            </AssemblyAttribute>
            <AssemblyAttribute Include="System.Reflection.AssemblyProductAttribute" Condition="'$(Product)' != '' and '$(GenerateAssemblyProductAttribute)' == 'true'">
              <_Parameter1>$(Product)</_Parameter1>
            </AssemblyAttribute>
            <AssemblyAttribute Include="System.Reflection.AssemblyTitleAttribute" Condition="'$(AssemblyTitle)' != '' and '$(GenerateAssemblyTitleAttribute)' == 'true'">
              <_Parameter1>$(AssemblyTitle)</_Parameter1>
            </AssemblyAttribute>
            <AssemblyAttribute Include="System.Reflection.AssemblyVersionAttribute" Condition="'$(AssemblyVersion)' != '' and '$(GenerateAssemblyVersionAttribute)' == 'true'">
              <_Parameter1>$(AssemblyVersion)</_Parameter1>
            </AssemblyAttribute>
            <AssemblyAttribute Include="System.Resources.NeutralResourcesLanguageAttribute" Condition="'$(NeutralLanguage)' != '' and '$(GenerateNeutralResourcesLanguageAttribute)' == 'true'">
              <_Parameter1>$(NeutralLanguage)</_Parameter1>
            </AssemblyAttribute>
          </ItemGroup>
        </Target>
      
        <!-- 
          To allow version changes to be respected on incremental builds (e.g. through CLI parameters),
          create a hash of all assembly attributes so that the cache file will change with the calculated
          assembly attribute values and msbuild will then execute CoreGenerateAssembly to generate a new file.
        -->
        <Target Name="CreateGeneratedAssemblyInfoInputsCacheFile"
                DependsOnTargets="GetAssemblyAttributes">
          <PropertyGroup>
            <GeneratedAssemblyInfoInputsCacheFile>$(IntermediateOutputPath)$(MSBuildProjectName).AssemblyInfoInputs.cache</GeneratedAssemblyInfoInputsCacheFile>
          </PropertyGroup>
      
          <Hash ItemsToHash="@(AssemblyAttribute->'%(Identity)%(_Parameter1)')">
            <Output TaskParameter="HashResult" PropertyName="_AssemblyAttributesHash" />
          </Hash>
      
          <WriteLinesToFile Lines="$(_AssemblyAttributesHash)" File="$(GeneratedAssemblyInfoInputsCacheFile)" Overwrite="True" WriteOnlyWhenDifferent="True" />
          
          <ItemGroup>
            <FileWrites Include="$(GeneratedAssemblyInfoInputsCacheFile)" />
          </ItemGroup>
        </Target>
      
        <Target Name="CoreGenerateAssemblyInfo"
                Condition="'$(Language)'=='VB' or '$(Language)'=='C#'"
                DependsOnTargets="CreateGeneratedAssemblyInfoInputsCacheFile"
                Inputs="$(GeneratedAssemblyInfoInputsCacheFile)"
                Outputs="$(GeneratedAssemblyInfoFile)">
          <ItemGroup>
            <!-- Ensure the generated assemblyinfo file is not already part of the Compile sources, as a workaround for https://github.com/dotnet/sdk/issues/114 -->
            <Compile Remove="$(GeneratedAssemblyInfoFile)" />
          </ItemGroup>
      
          <WriteCodeFragment AssemblyAttributes="@(AssemblyAttribute)" Language="$(Language)" OutputFile="$(GeneratedAssemblyInfoFile)">
            <Output TaskParameter="OutputFile" ItemName="Compile" />
            <Output TaskParameter="OutputFile" ItemName="FileWrites" />
          </WriteCodeFragment>
        </Target>
      
      
        <!--
          ==================================================================
                                                  GetAssemblyVersion
      
          Parses the nuget package version set in $(Version) and returns
          the implied $(AssemblyVersion) and $(FileVersion).
      
          e.g.:
              <Version>1.2.3-beta.4</Version>
      
          implies:
              <AssemblyVersion>1.2.3</AssemblyVersion>
              <FileVersion>1.2.3</FileVersion>
      
          Note that if $(AssemblyVersion) or $(FileVersion) are are already set, it
          is considered an override of the default inference from $(Version) and they
          are left unchanged by this target.
          ==================================================================
        -->
        <Target Name="GetAssemblyVersion">
          <GetAssemblyVersion Condition="'$(AssemblyVersion)' == ''" NuGetVersion="$(Version)">
            <Output TaskParameter="AssemblyVersion" PropertyName="AssemblyVersion" />
          </GetAssemblyVersion>
          
          <PropertyGroup>
            <FileVersion Condition="'$(FileVersion)' == ''">$(AssemblyVersion)</FileVersion>
            <InformationalVersion Condition="'$(InformationalVersion)' == ''">$(Version)</InformationalVersion>
          </PropertyGroup>
        </Target>
      
      </Project>
      

      3.2 部分自動生成

      弄清楚機制后,我們可以做成部分自動生成的。即部分程序集特性自動生成,另外一部分來自我們自己的AssemblyInfo.cs。

      具體辦法是修改項目的csproj文件,在PropertyGroup節點內加上“false”等內容,而不用GenerateAssemblyInfo。

      例如——

      <PropertyGroup>
        <TargetFramework>netcoreapp1.1</TargetFramework>
        <OutputType>Exe</OutputType>
        <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
        <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
        <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
      </PropertyGroup>
      

      GenerateAssemblyConfigurationAttribute這樣的參數名詳見 Microsoft.NET.GenerateAssemblyInfo.targets

      參考文獻

      posted on 2017-09-23 16:19  zyl910  閱讀(9709)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 又大又粗欧美黑人aaaaa片| 欧美成人片一区二区三区| 国产亚洲真人做受在线观看| 亚洲精品沙发午睡系列| 国产成人精品亚洲日本片| 文昌市| 中文字日产幕码三区国产| 荣成市| 日韩高清亚洲日韩精品一区二区| 亚洲国产精品无码久久电影| 在线中文字幕亚洲日韩2020| 色综合伊人色综合网站| 西西人体www大胆高清| 亚洲精品综合久久国产二区| 含紧一点h边做边走动免费视频| 91老熟女老人国产老太| 中文字幕精品人妻丝袜| 日本一区二区三区视频一| 国产精品久久蜜臀av| 西西人体大胆444WWW| 国产一区二区日韩经典| 日韩精品人妻av一区二区三区| 中文字幕精品亚洲字幕成 | 激情亚洲专区一区二区三区| 日本中文字幕有码在线视频| 欧美丰满熟妇xxxx性ppx人交| 人人妻人人做人人爽夜欢视频 | 国产成人精品无人区一区| 国产精品日韩av在线播放| 亚洲精品国模一区二区| 国产综合视频一区二区三区| 好爽毛片一区二区三区四| 成人午夜视频一区二区无码| 亚洲AV日韩AV高清在线观看| 亚洲成av人片天堂网无码 | 密云县| 中文字幕人妻av12| 日韩精品亚洲精品第一页| 国产小嫩模无套中出视频| 国产精品无遮挡在线观看| 无码av最新无码av专区|