我們需要的第一件事情 - 就是理清或地圖正在發生的事情在一般:
您執行exe文件 - >文件要求一個.NET CLR - > CLR的過程 - 你的主機執行。
所以要簡短,我就畫更短:
這是在以前發生的事情,以4.0:
執行File1.exe - > CLR過程 - >主機(.NET文件1。 EXE)=>這裏我假設file1.exe是.net1
執行File2.exe - > CLR Process2 - > hosts(.net File2.exe)=>這裏我假設file2.exe是.net2
執行File3.exe - > CLR Process3 - > hosts(.net File3.exe)=>這裏我假設file3.exe是.net3
在abov我假設的例子.net 3安裝在機器上,這就是爲什麼.net3 CLR是過程 - 真實 - 它被加載了3次!然而,由於DLL是相同的DLL窗口可能會共享它,使得它只是加載一次。但在內存中 - 它使用了3個不同的指令指針,每個進程都有自己獨立的堆。
這是4.0和4.5發生了什麼:
執行File4.exe - > CLR Process45 - >主機(.NET File4.exe)=>在這裏我想file4.exe是.NET4
執行file45.exe - >CLR Process45 - >也承載(.NET File45)=>這裏我假定file45.exe是.net4.5
在上述例子中我假定達網絡45被安裝在機器上,所以.net CLR4是隻加載一次的過程(而不是兩次!正如前面例子邏輯所期望的那樣)
您可以在我的答案末尾提供的鏈接中瞭解更多信息,以瞭解哪些版本可以「坐在」在一起 - 並非所有版本都可以與所有版本並排放置。
我的回答的第二部分與您所要求的確切關聯性更高:
任何進程都有一個堆 - 由於它是硬件的工作方式,因此無法更改。
(不管CLR哪個只是另一個過程在這個意義上可以做到的)
但是爲了能夠提供一個每個exe被託管的堆,他們發明了一個名爲「blob-heap」的概念,它被放置在堆CLR流程。可以一次管理很多blob堆。
CLR中的每個託管應用程序都有其自己的GC,它們是隔離的,彼此不知道。
據我瞭解,在.NET4中只能使用一個CLR,能夠管理許多主機項目或應用程序。這意味着許多應用程序將潛在地放慢彼此的速度,但即使使用「Multi-CLR」方法,情況也是如此。更嚴重的問題是,如果CLR本身停止運行......所有託管應用程序將停止運行它。我不知道如何或如果這種潛在的問題在架構中解決。
我從所有這些源中讀取組裝這樣的回答:
Common Language Runtime (CLR)
ECMA C# and Common Language Infrastructure Standards
Common Language Infrastructure (CLI) Partitions I to VI (6th edition)
In-Process Side-by-Side
Loading multiple CLR Runtimes (InProc SxS) – Sample Code
見http://stackoverflow.com/a/6982447/56778 –
@ JimMischel:如果這是來自Skeet大師,它肯定是真的。 :)你指向的討論太糟糕了,沒有被正確標記,所以我會找到它。我更新了它的標籤。謝謝:) – Pragmateek
@JimMischel:仍然是隔離問題... :) – Pragmateek