.net 本机程序集中的专用字节

.net 本机程序集中的专用字节,.net,ngen,.net,Ngen,我有一个在Citrix服务器场上运行的应用程序。在一台服务器上,您可以同时运行该应用程序的4-10个实例。该应用程序是通过单击一次下载的,因此当前不会共享程序集 我正在尝试减少内存占用,因此我尝试将这些程序集放在GAC中并对其进行加密。我编写了一个测试客户机,它引用了一个DLL,该DLL有一百万个生成的类,其中只有一个方法。生成类的代码如下所示: class Program { private const string ClassFormat = @"public cla

我有一个在Citrix服务器场上运行的应用程序。在一台服务器上,您可以同时运行该应用程序的4-10个实例。该应用程序是通过单击一次下载的,因此当前不会共享程序集

我正在尝试减少内存占用,因此我尝试将这些程序集放在GAC中并对其进行加密。我编写了一个测试客户机,它引用了一个DLL,该DLL有一百万个生成的类,其中只有一个方法。生成类的代码如下所示:

class Program
{
    private const string ClassFormat =
        @"public class AutoGen{0}
        {{
            public void Do()
            {{
               Console.WriteLine();
            }}
        }}";

    static void Main(string[] args)
    {
        using (FileStream fileStream = File.Open(@"Classes.cs", FileMode.Create, FileAccess.Write))
        using (StreamWriter streamWriter = new StreamWriter(fileStream))
        {
            streamWriter.WriteLine("using System;");
            for (int i = 0; i < 1000000; i++)
            {
                streamWriter.WriteLine(ClassFormat, i);
            }
        }
    }
}
类程序
{
私有常量字符串类格式=
@“公共类自动生成{0}”
{{
公营部门
{{
Console.WriteLine();
}}
}}";
静态void Main(字符串[]参数)
{
使用(FileStream FileStream=File.Open(@“Classes.cs”、FileMode.Create、FileAccess.Write))
使用(StreamWriter StreamWriter=newstreamwriter(fileStream))
{
streamWriter.WriteLine(“使用系统;”);
对于(int i=0;i<1000000;i++)
{
streamWriter.WriteLine(类格式,i);
}
}
}
}
.NET程序集为82928 K,使用VMMap查看时有0个专用字节。我已经设置了DLL,看到它是304724K,它有195096K是私有的。我还看到该进程同时加载托管DLL和本机DLL


为什么它同时加载dll,为什么它不能100%共享?

CLR必须首先加载常规dll才能访问元数据并发现ni.dll文件。常规dll中的msil永远不会被使用,也永远不会从文件中读取或映射到内存中。它仍然占用虚拟内存空间,这不需要任何成本。它是虚拟的。您在VMMap中看到的数字与运行时成本只有微弱的相关性。@HansPassant,如果NI部分中有私有内存,则必须通过写入将其私有化。这会导致运行时内存的使用。@HansPassant,这是有意义的,并且与82928k中只有28k在工作集中这一事实相关。知道所有的私有字节吗?我最好的猜测是,这是由重新定基造成的,但这似乎是一个很大的数字。但是它是100万个类,用100万个语句来创建一个类,看看这是否不同。