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,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]