2009-05-31 47 views
1

我正在研究一个简单的ASP .NET健康检查程序,并且遇到了一些障碍。ASP .NET c#远程检索非分页内存使用情况

1)我需要能够从远程机器(在同一网络上)获得完整的非分页内存使用情况。我试过使用System.Diganostics.Process.NonpagedSystemMemorySize64,但是我发现内核的非分页用法将会从这个总数中丢失。下面是我在做什么的快速示例:

Process[] myprocess = Process.GetProcesses("computername"); 

foreach (Process p in myprocess) 
{ 
nonpaged += p.NonpagedSystemMemorySize64; 
} 

2)我可以用System.Diagnostics.PerformanceCounter但是你只能在本地访问该类的API在本地解决。是否还有另一个课程可以满足我的需求?

任何帮助,将不胜感激。

回答

1

我以前用来抓取机器诊断的一种解决方案是使用DLLImport。

See P-Invoke

希望这有助于

皮特

在回答您的评论

当使用DLL的导入必须声明的函数包装自己。在下面的代码中,您可以看到public static extern void,它向编译器说这是一个外部调用,位于DLLImported kernel32.dll中的名为GlobalMemoryStatus的函数。 MemoryStatus结构是kernel32 dll中的函数的输出参数,并返回完全填充。

将其复制到您的代码中,并阅读他们应该帮助您理解的注释。

/// <summary> 
     /// Populates a memory status struct with the machines current memory status. 
     /// </summary> 
     /// <param name="stat">The status struct to be populated.</param> 
     [DllImport("kernel32.dll")] 
     public static extern void GlobalMemoryStatus(out MemoryStatus stat); 


     /// <summary> 
     /// The memory status struct is populated by the GlobalMemoryStatus external dll call to Kernal32.dll. 
     /// </summary> 
     public struct MemoryStatus 
     { 
      public uint Length; 
      public uint MemoryLoad; 
      public uint TotalPhysical; 
      public uint AvailablePhysical; 
      public uint TotalPageFile; 
      public uint AvailablePageFile; 
      public uint TotalVirtual; 
      public uint AvailableVirtual; 
     } 

// copy the guts of this method and add it to your own method. 
public void InspectMemoryStatus() 
{ 

MemoryStatus status = new MemoryStatus(); 
      GlobalMemoryStatus(out status); 

    Debug.WriteLine(status.TotalVirtual); 
} 

这应该允许您获得机器的内存诊断。

+0

感谢皮特, 但是没有GlobalMemoryStatus或GlobalMemoryStatusex属性的非分页使用或整个内核和/或内核分页的用法,除非我失去了一些东西。 – jw0rd 2009-06-03 01:16:44

+0

正如您在上面看到的,MemoryStatus结构具有内存和页面文件以及虚拟内存使用等方面的所有信息。 – Peter 2009-06-03 14:18:42