.NET Core 多框架支持(net45+netstandard20)實踐中遇到的一些問題總結

.NET Core 多框架支持(net45+netstandard20)實踐中遇到的一些問題總結

前言

本文主要是關於.NET Standard 代碼 在多框架 和 多平臺 支持本身實踐過程當中遇到的一些問題和解決辦法,但願給遇到這些問題的同窗一點參考和思路。問題基本上都是提在 博問 和 Stackoverflow 中,不乏不少大佬都提供瞭解決問題的思路。接下來則是正文。linux

問題1:如何發佈多個 TargetFramework 的nuget 包

問題來源 :主要是由於以前的類庫只提供了 .NET Standard2.0的版本。不少用戶反饋在 .NET Framework 下面不可用,因而有了這個問題。
git

1.2 問題描述:

.csproj 文件中聲明瞭github

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

可是用dotnet pack 命令發佈時一直報如下的錯:docker

error MSB3644: 未找到框架「.NETFramework,Version=v4.7.1」的引用程序集。若要解決此問題,請安裝此框架版本的 SDK 或 Tar
geting Pack,或將應用程序的目標從新指向已裝有 SDK 或 Targeting Pack 的框架版本。請注意,將從全局程序集緩存(GAC)解析程序集,並將使用這些程序集替換引用程序集。所以,程序集的目標可能未正確指向您所預期的框
架

而後安裝 net471的框架也安裝不了,請問如何解決?
遇到的問題是:項目依賴的是.net standard 2.0 ,可是用戶用的是 net461, netstand 的方法net461沒有,致使程序報錯!
json

1.3 解決辦法:

.csproj 文件中編寫以下windows

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

這時若是你編譯,或許會遇到System.Web 衝突的問題,或者是System.Web.HttpUlitity 在上下文中不存在。而後加入下面這句api

<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了,致使發佈出去的包找不到引用的程序集。
bash

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 就會以中文顯示,改一下操做系統語言則正常。

相關文章
相關標籤/搜索