当前位置:网站首页 / C#人爱学不学 / 正文

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

时间:2019年01月09日 | 作者 : aaronyang | 分类 : C#人爱学不学 | 浏览: 1573次 | 评论 0

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

创建1个标准类库

image.png

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

image.png

标准库有个依赖项

image.png  image.png

右击编辑

image.png

修改如下

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

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

</Project>

image.png

我们拷贝Common.cs文件

image.png

因为支持了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

生成项目

image.png

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


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

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



每次下载Github上的项目看

image.png

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


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

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

image.png

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

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

image.png



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

image.pngimage.png

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

image.png

然后

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]

image.png

image.png

百度原因

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

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

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


修改csproj

<GenerateAssemblyInfo>false</GenerateAssemblyInfo>

image.png

也可以单独控制

  <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的

image.png


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#,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音:wpfui 工作wpf

目前在合肥企迈科技公司上班,加我QQ私聊

2023年11月网站停运,将搬到CSDN上

AYUI8全源码 Github地址:前往获取

杨洋(AaronYang简称AY,安徽六安人)AY唯一QQ:875556003和AY交流

高中学历,2010年开始web开发,2015年1月17日开始学习WPF

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

标签列表