php中Standard中配置选项,在TargetFrameworks环境下如何输出库存
阅读原文时间:2023年07月10日阅读:2

在.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

复制代码