ASP.NET c#远程检索未分页内存的总使用量

ASP.NET c#远程检索未分页内存的总使用量,c#,asp.net,memory,C#,Asp.net,Memory,我正在开发一个简单的ASP.NET健康检查器,但遇到了一些障碍 1) 我需要能够从远程机器(在同一网络上)获取完整的非分页内存使用情况。我尝试过使用System.Diganostics.Process.NonpagedSystemMemorySize64,但是我逐渐意识到内核的非页面使用将从总数中消失。下面是我所做工作的一个快速示例: Process[] myprocess = Process.GetProcesses("computername"); foreach (Process p i

我正在开发一个简单的ASP.NET健康检查器,但遇到了一些障碍

1) 我需要能够从远程机器(在同一网络上)获取完整的非分页内存使用情况。我尝试过使用System.Diganostics.Process.NonpagedSystemMemorySize64,但是我逐渐意识到内核的非页面使用将从总数中消失。下面是我所做工作的一个快速示例:

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

foreach (Process p in myprocess)
{
nonpaged += p.NonpagedSystemMemorySize64;
}
2) 我可以通过使用System.Diagnostics.PerformanceCounter在本地解决这个问题,但是您只能在本地访问该类的API。还有适合我需要的课程吗


任何帮助都将不胜感激。

我以前用于获取机器诊断的一个解决方案是使用DLLImport

希望这有帮助

皮特

回应你的评论

使用DLL导入时,您必须自己声明函数包装器。在下面的代码中,您可以看到publicstaticexternvoid,它告诉编译器这是对位于DLLImported kernel32.dll中名为GlobalMemoryStatus的函数的外部调用。MemoryStatus结构是函数的一个输出参数,它在内核32 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);
}
//
///用当前内存状态填充内存状态结构。
/// 
///要填充的状态结构。
[DllImport(“kernel32.dll”)]
公共静态外部无效GlobalMemoryStatus(out MemoryStatus stat);
/// 
///内存状态结构由对Kernal32.dll的GlobalMemoryStatus外部dll调用填充。
/// 
公共结构MemoryStatus
{
公共单位长度;
公共uint MemoryLoad;
公共部门和实体部门;
公共单元可用物理;
公共uint总页面文件;
公共uint可用的页面文件;
公共信息网络;
公共uint可用虚拟设备;
} 
//复制此方法的核心,并将其添加到您自己的方法中。
公共系统状态()
{
MemoryStatus status=新的MemoryStatus();
GlobalMemoryStatus(输出状态);
Debug.WriteLine(status.TotalVirtual);
}

这将允许您获取机器的内存诊断。

我以前用于获取机器诊断的一个解决方案是使用DLLImport

希望这有帮助

皮特

回应你的评论

使用DLL导入时,您必须自己声明函数包装器。在下面的代码中,您可以看到publicstaticexternvoid,它告诉编译器这是对位于DLLImported kernel32.dll中名为GlobalMemoryStatus的函数的外部调用。MemoryStatus结构是函数的一个输出参数,它在内核32 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);
}
//
///用当前内存状态填充内存状态结构。
/// 
///要填充的状态结构。
[DllImport(“kernel32.dll”)]
公共静态外部无效GlobalMemoryStatus(out MemoryStatus stat);
/// 
///内存状态结构由对Kernal32.dll的GlobalMemoryStatus外部dll调用填充。
/// 
公共结构MemoryStatus
{
公共单位长度;
公共uint MemoryLoad;
公共部门和实体部门;
公共单元可用物理;
公共uint总页面文件;
公共uint可用的页面文件;
公共信息网络;
公共uint可用虚拟设备;
} 
//复制此方法的核心,并将其添加到您自己的方法中。
公共系统状态()
{
MemoryStatus status=新的MemoryStatus();
GlobalMemoryStatus(输出状态);
Debug.WriteLine(status.TotalVirtual);
}

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

谢谢Pete,但是,对于非分页使用或总内核和/或内核分页使用,没有GlobalMemoryStatus或GlobalMemoryStatusex属性,除非我遗漏了什么。正如您在上面看到的,MemoryStatus结构包含内存和页面文件以及虚拟内存使用等的所有信息。谢谢Pete,但是,对于非分页使用或总内核和/或内核分页使用,没有GlobalMemoryStatus或GlobalMemoryStatusex属性,除非我遗漏了一些内容。正如您在上面看到的,MemoryStatus结构包含内存和页面文件以及虚拟内存使用等的所有信息。