.NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结

.NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结

前言

本文主要是关于.NET Standard 代码 在多框架 和 多平台 支持自己实践过程中遇到的一些问题和解决办法,希望给遇到这些问题的同学一点参考和思路。问题基本上都是提在 博问 和 Stackoverflow 中,不乏很多大佬都提供了解决问题的思路。接下来则是正文。

问题1:如何发布多个 TargetFramework 的nuget 包

问题来源 :主要是因为之前的类库只提供了 .NET Standard2.0的版本。很多用户反馈在 .NET Framework 下面不可用,于是有了这个问题。

1.2 问题描述:

.csproj?文件中声明了

<TargetFrameworks>netstandard2.0;net471</TargetFrameworks>

但是用dotnet pack?命令发布时一直报以下的错:

error MSB3644: 未找到框架“.NETFramework,Version=v4.7.1”的引用程序集。若要解决此问题,请安装此框架版本的 SDK 或 Tar
geting Pack,或将应用程序的目标重新指向已装有 SDK 或 Targeting Pack 的框架版本。请注意,将从全局程序集缓存(GAC)解析程序集,并将使用这些程序集替换引用程序集。因此,程序集的目标可能未正确指向您所预期的框
架

然后安装 net471的框架也安装不了,请问如何解决?
遇到的问题是:项目依赖的是.net standard 2.0 ,但是用户用的是 net461, netstand 的方法net461没有,导致程序报错!

1.3 解决办法:

.csproj?文件中编写如下

<TargetFrameworks>netstandard2.0;net471</TargetFrameworks>

这时如果你编译,或许会遇到System.Web 冲突的问题,或者是System.Web.HttpUlitity 在上下文中不存在。然后加入下面这句

<ItemGroup Condition=" '$(TargetFramework)' == 'net471' ">
    <Reference Include="System.Web" />
  </ItemGroup>

就可以完美build 了,就解决了该问题了。
还有.net framework 4.7.1 框架装不了的原因也找到了,是因为我用错安装包了,没有下载 developer 的版本,正确的地址是
https://www.microsoft.com/en-us/download/details.aspx?id=56119?然而我用了这个?https://www.microsoft.com/en-us/download/details.aspx?id=56116

问题2:多个TargeFramework 导致关于Nuget包引用的问题

问题来源:这个问题是因为自己打包生成时的一个坑,忘记添加 Assembly Version了,导致发布出去的包找不到引用的程序集。

2.1 问题描述:

关于 Nuget 包解析的,有个最近项原则, 详情可参考NuGet 如何解析包依赖项?用一张微软的图来解释就是:

这个时候会选择最近的那个包,也就是 2.0 版本的。这没问题。
今天遇到的一个问题是,我的一个Nuget包(称之为 Package A 当前版本为 1.2.3 )本来只支持 netstandard 2.0 的版本,csproj 文件中的定义为

<TargetFramework>netstandard2.0</TargetFramework>

我有另外一个产品ECS Nuget 包(称之为 Package B 版本为 1.0.0),Package B 需要引用 Package A,
关系路线为 【Package B 1.0.0】 -> 【Package A 1.2.3】
这时,程序中调用这两个包可以正常使用的。
后来,由于对 .net framework 的支持,我把原本 Package A 的nuget 包修改了,改成了如下

<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>

Package A 包生成版本为 1.3.2,这个时候,我再引用上述两个包,发现编译没问题,但是在运行时报错了。

我通过升级 Package B 可以解决上面问题,但是为什么会出现这个错误呢?是因为使用了 TargetFrameworks ?还望大佬们指点指点

2.2 解决办法

对比一下 publish 文件夹中的?.deps.json?文件

按照这个思路,有了点眉目,也发现了一个程序中的Bug
第一张图使用老版本的Core,生成出来的deps.json

可以看出 AssemblyVersion 和 FileVersion 都为空,但是通过 runtimeconfig.json 文件可以找到 AssemblyVersion 和 FileVersion 为空的 dll。难道是因为 AssemblyVersion 和最开始的 1.3.2 文件不匹配导致的吗?

"aliyun-net-sdk-core/1.3.2": {
        "dependencies": {
          "Serilog": "2.5.0",
          "Serilog.Exceptions": "4.0.0",
          "Serilog.Sinks.File": "4.0.0"
        },
        "runtime": {
          "lib/netstandard2.0/aliyun-net-sdk-core.dll": {
            "assemblyVersion": "0.0.0.0",
            "fileVersion": "0.0.0.0"
          }
        }
      }

下面是重新生成后的 deps.json 文件,可以正常运行之前低版本的项目包。

结论:?由于 引用的 1.3.2 版本, 然而 CLR 在加载程序集时,找不到 Version 为 1.3.2 的DLL,于是就找原本项目引用的 1.2.3 版本,没有找到,于是报错。理清楚了。

问题3:target framework 为 .net 45 的项目,可以在 Linux 系统下编译吗?

问题来源:Linux上无法打包net45似乎是很正常的事,之前都是通过 windows docker 镜像打包好,然后推送到 nuget,但是由于公司网络的限制以及互通性上会有点问题,关于 .NET SDK 程序集的打包就遇到了无法在 Linux上打包 net45 程序集的问题,通过在 Github上跟踪 Issue,终于发现了解决办法。具体如下:

3.1 问题描述

Target Framework 为 .net framework 4.5 的项目,可以不可以在 Linux 下 dotnet build 生成 net45 的dll 和 运行 dotnet pack 打包生成 net45 和 netstandard2.0 的包?

3.2 解决方案

答案是可以的,哈哈。微软在Nuget针对这个专门发布了一个Nuget包,想要查看详细 Issue 的可以在这里查看?https://github.com/dotnet/designs/pull/33

Nuget上面包的地址为:?https://www.nuget.org/packages/Microsoft.NETFramework.ReferenceAssemblies/1.0.0-preview.2

只需要在你的csproj 文件中修改添加如下即可:

<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies"
                  Version="1.0.0-preview.1"
                  PrivateAssets="All" />

已在服务器上测试过:具体csporj 配置可以参考?https://github.com/aliyun/aliyun-openapi-net-sdk/blob/master/aliyun-net-sdk-core/aliyun-net-sdk-core.vs2017.csproj

如果有表述或者难以理解 以及 可以改进的地方,麻烦大家提出来。进行交流和讨论。

PS:还有一个就是中文Windows 操作系统中,想要在终端上让异常信息已英文的形式显示,需要更改系统的语言,使用
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
在有些情况下以英文显示,有些还是以中文显示。比如 WebRequest 返回的 WebException 就会以中文显示,改一下操作系统语言则正常。

原文地址:https://www.cnblogs.com/xiyin/p/10981930.html

时间: 2024-08-29 14:13:32

.NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结的相关文章

【转】Core Bluetooth框架之一:Central与Peripheral

原文网址:http://southpeak.github.io/blog/2014/07/29/core-bluetoothkuang-jia-zhi-%5B%3F%5D-:centralyu-peripheral/ iOS和Mac应用使用Core Bluetooth framework来与BLE(低功耗蓝牙)设备通信.我们的程序可以发现.搜索并与低功耗外围(Peripheral)蓝牙设备通信,如心跳监听器.数字温控器.甚至是其它iOS设备.这个框架抽象了支持蓝牙4.0标准低功耗设备的基本操作,

【转】Core Bluetooth框架之二:后台处理

原文网址:http://southpeak.github.io/blog/2014/07/31/core-bluetoothkuang-jia-zhi-er-:hou-tai-chu-li/ 在开发BLE相关应用时,由于应用在后台时会有诸多资源限制,需要考虑应用的后台处理问题.默认情况下,当程序位于后台或挂起时,大多数普通的Core Bluetooth任务都无法使用,不管是Central端还是Peripheral端.但我们可以声明我们的应用支持Core Bluetooth后台执行模式,以允许程序

Core Foundation 框架

Core Foundation 框架 2013-12-08 22:52 1978人阅读 评论(0) 收藏 举报 目录(?)[+] 转载自:http://blog.csdn.net/weiwangchao_/article/details/7744972 Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的服务: 群体数据类型 (数组.集合等) 程序包

IOS之Core Foundation框架和Cocoa Foundation框架的区别

Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的服务: 群体数据类型 (数组.集合等) 程序包 字符串管理 日期和时间管理 原始数据块管理 偏好管理 URL及数据流操作 线程和RunLoop 端口和soket通讯 Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation框架提供Objec

深度学习框架pytorch入门与实践(一):torch的基本使用

主要内容: 1.tensor的定义 2.tensor与numpy的相互转换 3.tensor使用cuda加速 4.tensor封装成Variable后的使用 # -*- coding: utf-8 -*- """ Created on Thu Aug 8 16:40:47 2019 pytorch快速入门教程 参考书籍:<深度学习框架pytorch:入门与实践> @author: zhaoqidong """ import torch

.NET Core EF框架使用SQL server 2008数据库分页问题:Incorrect syntax near &#39;OFFSET&#39;. Invalid usage of the option NEXT in the FETCH statement

一. 问题 最近.Net Core程序部署到服务器,采用EF6.本地数据库是SQL server 2016,服务器数据库安装的是SQL server 2008 R2,在用到分页查询时报错如下: { "Depth": 0, "ClassName": "", "Message": "Incorrect syntax near 'OFFSET'.\r\nInvalid usage of the option NEXT in

[ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [上篇]

微软在千禧年推出 .NET战略,并在两年后推出第一个版本的.NET Framework和IDE(Visual Studio.NET 2002,后来改名为Visual Studio),如果你是一个资深的.NET程序员,相信传统的.NET应用的开发方式已经深深地烙印在你的脑子里面..NET Core带来了全新的开发体验,但开发方式的差异根本不足以成为你快速跨入.NET Core 世界的门槛,因为在.NET Core在很多方面比传统的.NET Framework应用开发要简单.为了消除很多尚未接触过.

[ASP.NET Core 3框架揭秘] 跨平台开发体验: Linux

如果想体验Linux环境下开发.NET Core应用,我们有多种选择.一种就是在一台物理机上安装原生的Linux,我们可以根据自身的喜好选择某种Linux Distribution,目前来说像RHEL.Ubuntu.Debian.Fedora.CentOS和SUSE这些主流的Distribution都是支持的.如果读者朋友们觉得这种方式比较麻烦,我们也可以采用虚拟机的形式安装相应的Linux Distribution,比如我经常使用的都是安装在VirtualBox上的Ubuntu.对于X64 W

[ASP.NET Core 3框架揭秘] 依赖注入:控制反转

ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样会频繁地使用到它们.对于这里提到的这几个基础框架,依赖注入尤为重要.ASP.NET Core应用在启动以及后续针对请求的处理过程中,它会依赖各种的组件提供服务.为了便于定制,这些组件一般会以接口的形式进行"标准化",我们将这些标准化的组件统一称为"服务(Service)"