php中Standard中配置选项,在TargetFrameworks环境下如何输出库存
在.NET Standard/.NET Core技术出现之前,编写一个类库项目(暂且称为基础通用类库PA)且需要支持不同 .NET Framework 版本,那么可行的办法就是创建多个不同版本的项目(暂且称为PB1、PB2、PB3 ... PBn)。PB1、PB2、PB3 ... PBn项目分别执行下面操作:【添加】--【现有项】--【添加为链接的方式】,将PA项目代码文件添加到各自项目中,如果代码不同,则需要使用#if #else #endif 等标签来判断 .NET Framework 版本。而在.NET Standard/.NET Core技术出现之后,可以通过配置SDK 样式项目中的目标框架来支持一套代码同时输出多版本类库。
下面以Visual Studio 2019 来演示整个操作过程。
1、新建一个 .NET Standard 类库。
2、填写项目名称
3、创建完成后,查看“解决方案资源管理器”,项目下面多了一个“依赖项”节点,子节点是SDK,孙子节点是 NETStandard.Library(2.0.3)。
项目组织方式与传统类库项目的组织方式不同
4、项目,右键【属性】-->【应用程序】--> “目标框架”默认是 .NET Standard 2.0。
也可以修改为其他版本
5、编译项目,查看bin --> debug。生成了 netstandard2.0目录
目录里面生成的DLL,这与传统.NET Framework 类型的类库项目生成结果相同。
6、项目,右键 --> “编辑项目文件”
可以看到当前类库默认为 netstandard2.0,而此时其xml标签为 TargetFramework。
如果要支持多版本,则需要做调整,将 TargetFramework 节点修改为 TargetFrameworks,再添加目标版本。
7、配置多目标框架
关于如何指定多目标框架,请参考博客《.NET Standard SDK 样式项目中的目标框架》
我做的BIMFACE二次开发的接口的目标是支持 .NET Framework4.0、.NET Framework4.5 以及 .NET Core3.1。所以配置了选下3个目标版本
net40;net45;netstandard2.0;
修改后并保存,Visual Studio 会弹出黄色背景的提示信息。
这里一定要点击【重新加载项目】按钮。重新加载后,依赖项中出现了如下图所示的3个项
展开每个项查看, 每个版本的程序集对应一个单独的依赖项节点。
8、项目,右键【属性】-->【应用程序】--> “目标框架”被禁用,因为单个项目支持多版本类库,无法一次呈现多个,这是正确的。
9、重新编译项目,查看bin --> debug,生成了3种不同版本的目标程序集。
通过上面的步骤我们已经实现了多版本输出,但是在实际的企业级业务系统开发时情况比较复杂,还需要解决以下几个问题:
1、条件编译
2、引用本地程序集
3、NuGet方式引用程序集
4、XML文档输出
5、编码与DEBUG 调试
6、自动生成内部版本号
7、文件复制
下面逐步讲解如何解决以上问题。
一、条件编译
在下图中可以看出,编译成功后,在项目的默认位置 bin\Debug 下生成了3个不同目录,分别对应3个目标版本。
这是VS中默认的编译输出目录。
如果需要配置不同的类库输出到不同的位置,也可以自定义配置输出路径实现。
查看项目属性,【生成】-->“输出”-->“输出路径”中输入自定义目录或者点击【浏览】按钮选择一个目录。
填写后,保存项目。项目右键,【编辑项目文件】,csproj文件中自动增加了如下配置,其中 Condition 后面的表达式即是编译条件。OutputPath即是自定义输出目录。
bin\Debug\
按照以上方式再复制2份,分别配置 net45 与 netstandard2.0版。完整配置如下:
复制代码
bin\Debug\
bin\Debug\
bin\Debug\
复制代码
bin\Debug\ 是我自己定义的输出目录,大家可以根据实际需求填写其他目录。
$(Configuration) 的条件值有:Debug、Release。
$(TargetFramework)的条件为 节点中配置的值。
$(Platform) 的条件值有:
查看项目属性,【生成】-->“常规”-->“条件编译和符号”中输入自定义内容。选择 “定义DEGUG常数” 与 “定义TRACE常量”,保存项目。
查看csproj文件,在第一个目标版本对应的 配置节点下增加了
TRACE;DEBUG;NET_FULL;TEST;
为了做统一配置,将其提取出来
TRACE;DEBUG;RELEASE;NET_FULL;TEST;
二、引用本地程序集
在下图中可以看出由于3个不同的输出类库中所引用的程序集是不同的,那么当编译时,一定是每个类库进行单独编译,这时就就需要通过某种方式告诉编译器当前编译的类库版本是什么,然后添加针对具体版本的第三方程序集引用。
.NET Standard 指定多个目标框架时,可有条件地为每个目标框架引用程序集。
以下库项目面向 .NET Standard (netstandard1.4) 和 .NET Framework(net40 和 net45)的 API。 将复数形式的 TargetFrameworks 元素与多个目标框架一起使用。 为两个 .NET Framework TFM 编译库时,Condition 属性包括特定于实现的包:
复制代码
netstandard2.0;net40;net45
复制代码
php中Standard中配置选项,在TargetFrameworks环境下如何输出库存的更多相关文章
- JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构
		一.简介 JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构 二.依赖 <!-- https://mvnrepository.com/artifact/org.fus ... 
- 进一步探索:Windows Azure 网站中解锁的配置选项
		 编辑人员注释: 本文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写. 在 Windows Azure 网站 (WAWS) 中管理网站时,许多选项可使用 Azu ... 
- Spring3.1中使用profile配置开发测试线上环境
		如果在开发时进行一些数据库测试,希望链接到一个测试的数据库,以避免对开发数据库的影响. 开发时的某些配置比如log4j日志的级别,和生产环境又有所区别. 各种此类的需求,让我希望有一个简单的切换开发环 ... 
- Mac OS中使用VScode配置C语言开发环境
		个人博客 chinazt.cc 闲话少叙,直奔主题 下载VSCode https://code.visualstudio.com/download 安装C/C++插件 需要两个插件: 1. cppto ... 
- [转]Maven中profile和filtering实现多个环境下的属性过滤
		背景 项目构建的时候,需要根据不同的场景来改变项目中的属性资源,最为常见的莫过于数据库连接配置了,试想有生产环境.测试缓存.发布环境等,需要为不同的场景下来动态的改变数据库的连接配置.而使用maven ... 
- Rails4 中 因为secret key 引起在production环境下无法运行
		错误信息 Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml` ... 
- apache配置优化 - 解决apache环境下网站访问速度慢的问题(重点参考)
		如果apche访问量过大,将会导致页面打开迟缓,下载速度也降低,如果由于经费和环境问题,集群方案没有得以应用.可以通过对Apache2增加模块MPM来进行优化, 这里我选择线程型MPM加以优化: 开 ... 
- 配置虚拟主机(windows环境下nginx+php)
		需要给一个ip绑定不同域名,例如有两个项目/www/,/www2/ 需要http://a.com时访问的是www 项目 http://b.com访问的是www2项目 那么需要在nginx/conf ... 
- CentOS7中OpenVPN的配置
		最近需要在openstack中集成openvpn功能,故熟悉了一下openvpn的搭建流程,记录下来,供参考 版本:openvpn-2.3.4.tar.gz 下载地址:http://pan.baidu ... 
随机推荐
- mysql-17-procedure
			#存储过程 /* 一组预先编译好的sql语句集合,理解成批处理语句 好处: 1.提高代码重用性 2.简化操作 3.减少了编译次数并减少了和数据库服务器的连接次数,提高了效率 */ #一.创建 /* c ... 
- jQuery中使用$.each()遍历数组时要注意的地方
			使用jQuery中 $.each()遍历数组,要遍历的数组不能为空(arry!="") 例如: $.each(arry, function (i, item) ... 
- Layman 对PHP源码进行加密保护
			加密软件(php_screw) >下载网站:http://sourceforge.net/projects/php-screw/ >描述:php文件通常以文本格式存贮在服务器端, 很容易被 ... 
- SPI通信基础学习
			SPI是"Serial Peripheral Interface"的缩写,即"串行外设接口",是摩托罗拉公司推出的一种串行接口通信协议. 接线的示意图: SPI ... 
- java 的 callback
			Java 本身没有回调这一说,但是面向对象可以模拟出来. 1. 回调接口对象 ICommand package com.git.Cmder; public interface ICommand { v ... 
- 多测师讲解requests __介绍_高级讲师肖sir
			我们今天讲解的内容 一.什么是Requests? Requests是用Python语言编写的简单易用的HTTP库,用来做接口测试的库. 二.安装requests库 1.按住Windows标志+r,在运 ... 
- 多测师讲解自动化 _rf 变量_高级讲师肖sir
			rf变量 log 打印全局变量 列表变量: 字典变量: 查看当前工程下的变量 紫色表示变量名有误 设置全局变量 设置列表变量 设置字段变量 关键字书写格式问题 
- IdentityServer 3.1.x 迁移到 4.x
			一.前言 IdentityServer4 4.x已经正式发布了,根据官方的 Release Note,3.1.x 到 4.x 的变更也是非常多,今天在将代码迁移到 4.x 遇到了一些问题在此记录下来, ... 
- MATLAB利用solve函数解多元一次方程组
			matlab求解多元方程组示例: syms k1 k2 k3; [k1 k2 k3] = solve(-3-k3==6, 2-k1-k2+2*k3==11, 2*k1+k2-k3+1==6)或者用[k ... 
- Go语言基础知识01-用Go打个招呼
			每一种编程语言,从读一本好书开始 每一种编程语言,也从Helloworld开始 1. 环境准备 1.1 安装golang 在Ubuntu下,直接输入命令可以安装最新版本: $ sudo apt-get ... 
