.NET FRAMEWORK版本:4.0.30319; ASP.NET版本:4.6.118.0


https://gqqnbig.me/2015/11/23/net-framework%e7%89%88%e6%9c%ac4-0-30319-asp-net%e7%89%88%e6%9c%ac4-6-118-0/?utm_source=tuicool&utm_medium=referral

.net framework 4.5是一個就地升級,直接升級了.net 4.0;而不是與.net 4.0並存。[1]

.net framework 4.5由公共語言運行時(CLR)4.0、一些新的類和老的類的補丁組成,所以Environment.Version仍然返回4.0.30319.42000。

安裝Visual Studio 2015時也會一起安裝.net 4.6,同樣4.6也是一個就地升級。[2]

在目標版本為4.0的項目里,按常識肯定不能訪問4.6引入的類和方法。

IReadOnlyCollection<>泛型接口是.net 4.5引入的,當然不能在4.0里使用IReadOnlyCollection<>泛型接口是.net 4.5引入的,當然不能在4.0里使用

但是你如果用反射的方法搜索程序集,會發現IReadOnlyCollection其實加載進來了。

如果你安裝了.net 4.5,即使目標版本為4.0,4.5的新類型也會加載進來如果你安裝了.net 4.5,即使目標版本為4.0,4.5的新類型也會加載進來

另外,4.5和4.6的升級,都包括對4.0類型的修改,如System.Web.UI.Control新增了BeginRenderTracing()方法。

所以,在目標版本為4.0的項目里不能訪問4.5的類型,其實只是visual studio做的一個限制。就是說你的程序明明是運行於4.5版本,但你還是欺騙自己說你運行的是4.0。

所以,如果你已經升級到了.net framework 4.5或4.6,建議同時把你的4.0項目升級成最高版本,避免自欺欺人,使用更多的新類型和方法,並且排查問題也知道這是4.5或4.6的問題,而不是4.0,除非你有一台沒升級4.5的機器。

本文所用的測試代碼如下

[code lang="vb"]
Private Sub Default_Load(sender As Object, e As EventArgs) Handles Me.Load
Response.Write(".NET Framework版本是" & Environment.Version.ToString & "。<br/>")

'Dim a As System.Collections.Generic.IReadOnlyCollection(Of String)

Dim allLoadedTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(Function(x) x.GetTypes())

Dim typeofIReadOnlyCollection = allLoadedTypes.FirstOrDefault(Function(x) x.Name.Contains("IReadOnlyCollection"))
If typeofIReadOnlyCollection IsNot Nothing Then
Response.Write("找到了IReadOnlyCollection,它有" & typeofIReadOnlyCollection.GetMethods().Count & "個方法和" _
& typeofIReadOnlyCollection.GetProperties().Count & "個屬性。")
End If

'For Each type In allLoadedTypes
' Response.Write(type.AssemblyQualifiedName & "<br/>")
'Next
End Sub
[/code]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM