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

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

内容简介:====================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#,”的文章


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

查看所有标签

猜你喜欢:

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

Building Social Web Applications

Building Social Web Applications

Gavin Bell / O'Reilly Media / 2009-10-1 / USD 34.99

Building a social web application that attracts and retains regular visitors, and gets them to interact, isn't easy to do. This book walks you through the tough questions you'll face if you're to crea......一起来看看 《Building Social Web Applications》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具