Первое, что нам нужно - это разобраться или карта, что происходит в целом:
вы исполняете свой файл ех -> файл запрашивает .NET CLR -> процесс CLR - хостит выполнение.
Так быть кратким, я нарисую его короче:
Это то, что происходит в предыдущем 4.0:
Выполнить file1.exe -> CLR Process -> хосты (.net File1. exe) => здесь я предполагаю, что file1.exe is .net1
Execute File2.exe -> CLR Process2 -> hosts (.net File2.exe) => здесь я предполагаю, что file2.exe is .net2
Execute File3.exe -> CLR Process3 -> hosts (.net File3.exe) => здесь я предполагаю, что файл3.exe is .net3
В abov например, я предполагаю, что на компьютере установлено .net 3, и именно поэтому .net3 CLR - это процесс - и правда - он был загружен 3 раза! однако, поскольку DLL - это то же самое, DLL-окна могут делиться им так, как будто он был загружен только один раз. но в памяти - на нем используются 3 разных указателя указателя, и каждый процесс имеет свою отдельную кучу.
И это то, что происходит с 4.0 и 4.5:
Выполнить File4.exe -> CLR Process45 -> хосты (.net File4.exe) => здесь я предполагаю, что file4.exe является .net4
Execute file45.exe ->CLR Process45 -> также содержит (.net File45) => здесь я предполагаю, что file45.exe является .net4.5
В приведенных выше примерах, я предполагаю, что .net 45 установлен на машине , поэтому .net CLR4 - это процесс, который был загружен только один раз (а не дважды! как и ожидалось из предыдущей логики примеров)
Вы можете прочитать больше в ссылках, которые я предоставляю в конце своего ответа, чтобы узнать, какие версии могут «сидеть» вместе - не вся версия может сидеть бок о бок со всеми версиями.
Вторая часть моего ответа более релевантна тому, что вы задаете точным:
Любой процесс имеет одну кучу, которая не может быть изменена, так как это работает.
(независимо от того, что может сделать CLR, который является просто другим процессом в этом смысле)
Но для того, чтобы обеспечить кучу на каждом exe, они изобрели концепцию с названием «blob-heap», которая помещается в кучу процесс CLR. так много кучи blob можно управлять сразу.
Каждое размещенное приложение в CLR имеет свой собственный GC, и они изолированы и не знают друг о друге.
Насколько я понимаю, только один CLR используется в .NET4, который может управлять многими хост-элементами или приложениями. Это означает, что многие приложения будут замедлять друг друга в потенциале, но это правда, даже если вместо этого использовался подход «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: Если это от Master Skeet, это должно быть правдой. :) Слишком плохо, что обсуждение, на которое вы указываете, не было правильно помечено, так что я бы его нашел. Я обновил его теги. Спасибо :) – Pragmateek
@JimMischel: остается вопрос изоляции ... :) – Pragmateek