AY Github项目学框架技巧-Visual Studio 标准类库

栏目: ASP.NET · 发布时间: 5年前

内容简介:====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========创建1个标准类库

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

创建1个标准类库

AY Github项目学框架技巧-Visual Studio 标准类库

我们一开始写了2个,那如果还有4.0,3.5就不方便了

AY Github项目学框架技巧-Visual Studio 标准类库

标准库有个依赖项

AY Github项目学框架技巧-Visual Studio 标准类库 AY Github项目学框架技巧-Visual Studio 标准类库

右击编辑

AY Github项目学框架技巧-Visual Studio 标准类库

修改如下

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

  <PropertyGroup>
    <TargetFrameworks>net20;net35;net40;net45;net46;netstandard1.4;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

</Project>

AY Github项目学框架技巧-Visual Studio 标准类库

我们拷贝Common.cs文件

AY Github项目学框架技巧-Visual Studio 标准类库

因为支持了2.0Framework ,他不支持LINQ的,所有有些代码就有约束了。

你可以在csproj,自己控制,下面是参考的,条件方式的引用

  <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net20|AnyCPU'">
    <DebugType>full</DebugType>
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net20'">
    <PackageReference Include="NUnit.System.Linq" Version="0.6.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="Microsoft.Win32.Registry" Version="4.4.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.4'">
    <PackageReference Include="System.Reflection.TypeExtensions" Version="4.4.0" PrivateAssets="compile" />
  </ItemGroup>
  
  <ItemGroup Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework'">
    <Reference Include="System.Web" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="WindowsBase" Condition="'$(TargetFramework)' != 'net20'" />
  </ItemGroup>

在写代码如果想支持多种,使用预处理器,下面是参考的 #if NET45啥的

#if DEBUG
#if NET45
[assembly: AssemblyConfiguration(".NET Framework 4.5 Debug")]
#elif NET40
[assembly: AssemblyConfiguration(".NET Framework 4.0 Debug")]
#elif NET35
[assembly: AssemblyConfiguration(".NET Framework 3.5 Debug")]
#elif NET20
[assembly: AssemblyConfiguration(".NET Framework 2.0 Debug")]
#elif NETSTANDARD1_4
[assembly: AssemblyConfiguration(".NET Standard 1.4 Debug")]
#elif NETSTANDARD2_0
[assembly: AssemblyConfiguration(".NET Standard 2.0 Debug")]
#elif NETCOREAPP1_1
[assembly: AssemblyConfiguration(".NET Core 1.1 Debug")]
#elif NETCOREAPP2_0
[assembly: AssemblyConfiguration(".NET Core 2.0 Debug")]
#else
#error Missing AssemblyConfiguration attribute for this target.
#endif
#else
#if NET45
[assembly: AssemblyConfiguration(".NET Framework 4.5")]
#elif NET40
[assembly: AssemblyConfiguration(".NET Framework 4.0")]
#elif NET35
[assembly: AssemblyConfiguration(".NET Framework 3.5")]
#elif NET20
[assembly: AssemblyConfiguration(".NET Framework 2.0")]
#elif NETSTANDARD1_4
[assembly: AssemblyConfiguration(".NET Standard 1.4")]
#elif NETSTANDARD2_0
[assembly: AssemblyConfiguration(".NET Standard 2.0")]
#elif NETCOREAPP1_1
[assembly: AssemblyConfiguration(".NET Core 1.1")]
#elif NETCOREAPP2_0
[assembly: AssemblyConfiguration(".NET Core 2.0")]
#else
#error Missing AssemblyConfiguration attribute for this target.
#endif
#endif

生成项目

AY Github项目学框架技巧-Visual Studio 标准类库

我还看到一些程序集的知识点

当你的项目有很多 类库,当然你不能维护很多项目的Assembly的程序集的信息,统一版本啊,公司名称等很多信息,我的AYUI 7个类库,就遇到这种需求了。

当然我可以新建一个项目,使用 assembly 文件添加为链接的方式,这样只需要维护1个了。

每次下载Github上的项目看

AY Github项目学框架技巧-Visual Studio 标准类库

会有个这种东西,不管这个

一个标准的程序集信息,外层有个文件,他不属于任何csproj,和上面我们说新建1个类库放共用文件的区别  CommonAssemblyInfo.cs 这里我拿NUnit架构讲的。

当然这个文件和snk强命名秘钥

AY Github项目学框架技巧-Visual Studio 标准类库

然后项目都是添加为链接方式

我在项目新增了Assembly文件夹,放入了

AY Github项目学框架技巧-Visual Studio 标准类库

属性中,创建1个资源,为了创建一个Properties文件夹,然后删除Resources.resx因为我用不上

AY Github项目学框架技巧-Visual Studio 标准类库 AY Github项目学框架技巧-Visual Studio 标准类库

然后添加文件链接引用这2个,然后新建一个类AssemblyInfo.cs

AY Github项目学框架技巧-Visual Studio 标准类库

然后

using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;

//[assembly: InternalsVisibleTo("nunit.framework.tests, PublicKey=002400000480000094" +
//                              "000000060200000024000052534131000400000100010031eea" +
//                              "370b1984bfa6d1ea760e1ca6065cee41a1a279ca234933fe977" +
//                              "a096222c0e14f9e5a17d5689305c6d7f1206a85a53c48ca0100" +
//                              "80799d6eeef61c98abd18767827dc05daea6b6fbd2e868410d9" +
//                              "bee5e972a004ddd692dec8fa404ba4591e847a8cf35de21c2d3" +
//                              "723bc8d775a66b594adeb967537729fe2a446b548cd57a6")]

#if NET45
[assembly: AssemblyTitle("AY Framework (.NET Framework 4.5)")]
#elif NET40
[assembly: AssemblyTitle("AY Framework (.NET Framework 4.0)")]
#elif NET35
[assembly: AssemblyTitle("AY Framework (.NET Framework 3.5)")]
#elif NET20
[assembly: AssemblyTitle("AY Framework (.NET Framework 2.0)")]
#elif NETSTANDARD1_4
[assembly: AssemblyTitle("AY Framework (.NET Standard 1.4)")]
#elif NETSTANDARD2_0
[assembly: AssemblyTitle("AY Framework (.NET Standard 2.0)")]
#else
#error Missing AssemblyTitle attribute for this target.
#endif

[assembly: AssemblyDescription("")]
[assembly: AssemblyCulture("")]
[assembly: CLSCompliant(true)]

[assembly: AllowPartiallyTrustedCallers]

AY Github项目学框架技巧-Visual Studio 标准类库

AY Github项目学框架技巧-Visual Studio 标准类库

百度原因

.NET Core/Standard 2.0 推荐在项目属性的“Package”页配置程序集的 版本、描述 等信息。

编译时,会自动根据“Package”页的配置,生成 “ <项目名> .AssemblyInfo.cs”。其中便使用了 AssemblyFileVersionAttribute 等特性。

我们的 AssemblyInfo.cs 中也使用 AssemblyFileVersionAttribute 等特性。因为 AssemblyFileVersionAttribute 等特性是不允许重复,于是便报出CS0579错误了。

修改csproj

<GenerateAssemblyInfo>false</GenerateAssemblyInfo>

AY Github项目学框架技巧-Visual Studio 标准类库

也可以单独控制

  <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
  <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
  <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>

AssemblyInfo.cs代码

using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;

//[assembly: InternalsVisibleTo("nunit.framework.tests, PublicKey=002400000480000094" +
//                              "000000060200000024000052534131000400000100010031eea" +
//                              "370b1984bfa6d1ea760e1ca6065cee41a1a279ca234933fe977" +
//                              "a096222c0e14f9e5a17d5689305c6d7f1206a85a53c48ca0100" +
//                              "80799d6eeef61c98abd18767827dc05daea6b6fbd2e868410d9" +
//                              "bee5e972a004ddd692dec8fa404ba4591e847a8cf35de21c2d3" +
//                              "723bc8d775a66b594adeb967537729fe2a446b548cd57a6")]
#if NET46
    [assembly: AssemblyTitle("AY Framework (.NET Framework 4.6)")]
#elif NET45
[assembly: AssemblyTitle("AY Framework (.NET Framework 4.5)")]
#elif NET40
[assembly: AssemblyTitle("AY Framework (.NET Framework 4.0)")]
#elif NET35
[assembly: AssemblyTitle("AY Framework (.NET Framework 3.5)")]
#elif NET20
[assembly: AssemblyTitle("AY Framework (.NET Framework 2.0)")]
#elif NETSTANDARD1_4
[assembly: AssemblyTitle("AY Framework (.NET Standard 1.4)")]
#elif NETSTANDARD2_0
[assembly: AssemblyTitle("AY Framework (.NET Standard 2.0)")]
#else
#error Missing AssemblyTitle attribute for this target.
#endif

[assembly: AssemblyDescription("")]
[assembly: AssemblyCulture("")]
[assembly: CLSCompliant(true)]

[assembly: AllowPartiallyTrustedCallers]

CommonAssemblyInfo.cs

using System.Reflection;

//
// Common Information for the NUnit assemblies
//
[assembly: AssemblyCompany("AY Software")]
[assembly: AssemblyProduct("AYUI X")]
[assembly: AssemblyCopyright("Copyright (c) 2019 AY")]
[assembly: AssemblyTrademark("AYUI is a MVC framework of WPF Tech.")]

#if DEBUG
#if NET46
[assembly: AssemblyConfiguration(".NET Framework 4.6 Debug")]

#elif NET45
[assembly: AssemblyConfiguration(".NET Framework 4.5 Debug")]
#elif NET40
[assembly: AssemblyConfiguration(".NET Framework 4.0 Debug")]
#elif NET35
[assembly: AssemblyConfiguration(".NET Framework 3.5 Debug")]
#elif NET20
[assembly: AssemblyConfiguration(".NET Framework 2.0 Debug")]
#elif NETSTANDARD1_4
[assembly: AssemblyConfiguration(".NET Standard 1.4 Debug")]
#elif NETSTANDARD2_0
[assembly: AssemblyConfiguration(".NET Standard 2.0 Debug")]
#elif NETCOREAPP1_1
[assembly: AssemblyConfiguration(".NET Core 1.1 Debug")]
#elif NETCOREAPP2_0
[assembly: AssemblyConfiguration(".NET Core 2.0 Debug")]
#else
#error Missing AssemblyConfiguration attribute for this target.
#endif
#else
#if NET45
[assembly: AssemblyConfiguration(".NET Framework 4.5")]
#elif NET40
[assembly: AssemblyConfiguration(".NET Framework 4.0")]
#elif NET35
[assembly: AssemblyConfiguration(".NET Framework 3.5")]
#elif NET20
[assembly: AssemblyConfiguration(".NET Framework 2.0")]
#elif NETSTANDARD1_4
[assembly: AssemblyConfiguration(".NET Standard 1.4")]
#elif NETSTANDARD2_0
[assembly: AssemblyConfiguration(".NET Standard 2.0")]
#elif NETCOREAPP1_1
[assembly: AssemblyConfiguration(".NET Core 1.1")]
#elif NETCOREAPP2_0
[assembly: AssemblyConfiguration(".NET Core 2.0")]
#else
#error Missing AssemblyConfiguration attribute for this target.
#endif
#endif

FrameworkVersion.cs

using System.Reflection;

[assembly: AssemblyVersion("3.11.0.0")]
[assembly: AssemblyFileVersion("3.11.0.0")]

OK了,这样每个项目,维护1份 程序集信息了。

关于程序集信息

使用InternalsVisibleTo特性干嘛的

是为了给其他类库测试 Internal级别的方法的,我们知道Internal只能本程序集调用。使用这个特性,就可以不修改源码的情况下,给别的测试项目测试用

这里是Nunit的

AY Github项目学框架技巧-Visual Studio 标准类库

1. 如何获取PublicKey?

A: 在命令行下,使用sn -Tp Project1.Test.dll就可以看到PublicKey和PublicKeyToken

2. 如果Project1是个strong-named的项目,那么InternalsVisibleTo必须指定PublicKey,所以Project1.Test也必须使用强签名才能正确使用InternalsVisibleTo, 不然编译会出错,如果Project1没有使用强签名,那么Project1.Test也不必使用强签名,而且在使用InternalsVisibleTo的时候只需要程序集的名字就可以了,不需要设置PuklicKey。

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

以上内容AY 研究编写

推荐您阅读更多有关于“C#,”的文章


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构与算法分析

数据结构与算法分析

韦斯 / 机械工业 / 2007-1 / 55.00元

本书是国外数据结构与算法分析方面的标准教材,使用最卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。   随着计算机速度的不断增加和功能的日益强大,人们对有效编程和算法分析的要求也在增长。本书把算法分析与最有效率的Java程序的开发有机地结合起来,深入分析每种算法,内容全面、缜密严格,并细致讲解精心构造程序的方法。   第......一起来看看 《数据结构与算法分析》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具