机器上运行的CLR和GC实例数?

时间:2009-06-03 07:08:44

标签: .net clr

我创建了2个.NET应用程序并在一台机器上运行 - 有多少CLR和gc将在那里?

此外:我想了解一下Windows如何处理COM组件和CLR的背景信息。希望有人可以详细说明CLR如何在内存中加载,以及如果我在运行此命令时列出多个CLR实例,这意味着什么:

tasklist /m mscor* 

实际上是多个CLR还是单个CLR作为所有.NET进程的COM服务器?

4 个答案:

答案 0 :(得分:10)

每个进程都有自己的CLR副本作为托管进程。但是,由于CLR实际上只是几个DLL,Windows将能够在进程之间共享DLL。有关详细信息,请参阅:http://msdn.microsoft.com/en-us/magazine/cc301727.aspx

答案 1 :(得分:7)

除了Portable Executable (PE format)之外,托管exe还有一个额外的 CLR标头。操作系统现在能够确定启动的exe是否是“托管”exe,因此在后台加载CLR并赋予其控制权。

  • mscoree.dll是一个填充程序DLL(此文件的最新版本始终存在于Windows / System32文件夹中,因此知道如何加载当前和旧版本的CLR。)
  • mscorwks.dll是CLR的实际实现。如果您安装了多个版本的框架,您将找到此dll的多个版本。这个dll的正确版本由垫片dll加载。

从上面可以看出,每个托管可执行文件的进程都有自己的CLR副本(2个Dll)。 ManagedExecutable1可能正在使用CLR v1,而ManagedExecutable2可能正在使用CLR v2。截至目前,它们尚未共享 垃圾收集器是CLR的一部分,因此在托管可执行文件的进程中也是不同的。

答案 2 :(得分:1)

我想说你可以通过检查加载的dll来轻松计算运行或加载CLR的进程。但我不确定您是否能够计算运行的应用程序域的数量。但我认为这不是你的目标。

每个进程只有一个堆,还有一个GC,它在收集期间挂起所有托管线程。因此,您可以遍历这些进程并检查是否加载了mscorlib,如果是这样,您可以假设它正在运行.NET CLR和GC。我确信应该有更好的方法来确定进程是否托管了CLR,请检查CLR API。

请通过C#尝试Jeffrey Richter的书CLR,以便更加了解。

下面的代码迭代.NET进程

// Import these namespaces
using System.Diagnostics;
using System.ComponentModel;

// Here is the code
Process[] prcs = Process.GetProcesses();
foreach (Process prc in prcs)
{
    try
    {
        foreach (ProcessModule pm in prc.Modules)
        {
            if (pm.ModuleName.Contains("mscorlib"))
            {
                Console.WriteLine(prc.ProcessName);
            }
        }
    }
    catch (Win32Exception exWin)
    {
        // Cannot detemine process modules ... some will deny access
    }
}

答案 3 :(得分:0)

CLR实际上是将MSIL转换为本机机器代码的组件。然后,本机代码在每个应用程序的自己的进程中运行。

在.NET世界中,进程与appdomain密切相关。这就是为什么我认为this是一个很好的起点。