检查当前和外部 .Net 进程是否启用了性能计数器?

Check if current and external .Net process has performance counters enabled?

在 C# 或其他 VB.Net 中,并且只有一个进程的 PID,我想知道是否可以在执行时检查关联的进程是否已启用性能计数器。

我的意思是当 performanceCounters 设置在其 app.config:

中启用时
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
  <system.net>
    <settings>
      <performanceCounters enabled="true"/>
    </settings>
  </system.net>
...
</configuration>

但是,我问的是使用反射或其他 .Net Framework 成员的 proper/built-in 解决方案是否可能存在,而不是对 app.config[ 进行原始检查=26=] 文件,然后解析文件以找到设置,我知道,这是我要避免的。

作为次要问题我会问:

如何在当前进程中检查相同的东西?, 我问这个是因为确定当前进程中是否启用性能计数器的方法可能比在外部进程中确定它更容易(但我再次要求这个解决方案以避免解析 app.config 文件).

您特别想避免解析 app.config 文件,但坦率地说我愿意。你的问题表明你不想 "manually" 解析 app.config,你不必这样做(所以我会固执地提出以下建议 ;-))

检查当前进程:

        var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var group = (NetSectionGroup)config.GetSectionGroup("system.net");
        if (group.Settings.PerformanceCounters.Enabled)
        {
            Console.WriteLine("ENABLED");
        }

检查其他进程,确实是可执行文件。

        var config = ConfigurationManager.OpenExeConfiguration(@" ... path to other executable ... ");
        var group = (NetSectionGroup)config.GetSectionGroup("system.net");
        if (group.Settings.PerformanceCounters.Enabled)
        {
            Console.WriteLine("ENABLED");
        }

通常所有每进程性能计数器都将 PID(或进程名称或其他一些识别信息)嵌入到性能计数器实例名称中:

(黄色高亮部分为PID)

因此,如果进程 ID 是您所拥有的,您可以在实例名称周围搜索此子字符串。

我用App config文件做了这个Generic usage function是为了以后的需要,也许它不能在所有场景下解析树级架构,但是嘿,这只是一个开始。

用法:

 GetAppConfigSetting(Of Boolean)("system.net", "settings", "performanceCounters", "enabled"))

来源:

Public Shared Function GetAppConfigSetting(Of T)(ByVal sectionGroupName As String,
                                                 ByVal sectionName As String,
                                                 ByVal elementName As String,
                                                 ByVal propertyName As String,
                                                 Optional ByVal exePath As String = "") As T

    Dim appConfig As Configuration
    Dim group As ConfigurationSectionGroup
    Dim section As ConfigurationSection
    Dim sectionPropInfo As PropertyInformation
    Dim element As ConfigurationElement
    Dim elementPropInfo As PropertyInformation

    If Not String.IsNullOrEmpty(exePath) Then
        appConfig = ConfigurationManager.OpenExeConfiguration(exePath)
    Else
        appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
    End If

    group = appConfig.GetSectionGroup(sectionGroupName)
    If group Is Nothing Then
        Return Nothing
    End If

    section = group.Sections(sectionName)
    If section Is Nothing Then
        Return Nothing
    End If

    sectionPropInfo = section.ElementInformation.Properties(elementName)
    If sectionPropInfo Is Nothing Then
        Return Nothing
    End If

    element = DirectCast(sectionPropInfo.Value, ConfigurationElement)
    If element Is Nothing Then
        Return Nothing
    End If

    elementPropInfo = element.ElementInformation.Properties(propertyName)
    If elementPropInfo Is Nothing Then
        Return Nothing
    End If

    Return DirectCast(elementPropInfo.Value, T)

End Function