ManagementException - 无效的类

时间:2013-02-11 01:37:39

标签: c# .net wmi vmware wmi-query

我有一个问题,查询WMI让我感到困惑。我正在构建的应用程序将作为VMware View Agent一部分安装的WMI计数器用于VDI桌面。计数器提供有关远程显示协议PCoIP的信息。

我有工作代码来查询计数器:

ManagementObjectSearcher searcher = new ManagementObjectSearcher();

ObjectQuery generalQuery = new ObjectQuery("SELECT * FROM Win32_PerfRawData_TeradiciPerf_PCoIPSessionGeneralStatistics");

// Many other queries...

searcher.Query = generalQuery;
foreach (ManagementObject obj in searcher.Get())
{
  // Total session duration
  ulong sessionDurationSec = Convert.ToUInt64(obj["SessionDurationSeconds"]);
  // Get other items...
}

此代码来自现有的.NET 3.5应用程序。我现在已经创建了一个新的.NET 4.0应用程序,并且我使用完全相同的代码 - 每次都出现“Invalid Class”ManagementException。

我已经验证了应用程序权限是正确的,我还尝试在新的.NET 4.0应用程序中查询其他项目,如“Win32_Process”,它没有问题。

令人费解的是,计数器在perfmon和wmic中出现并正常工作:

http://hirstius.com/media/stackoverflow/perfmon.png

但是在WMI CIM Studio或WMI Code Creator中 - 没有:

http://hirstius.com/media/stackoverflow/WMI_code_creator.png

在各方面我都能想到应用程序是相同的 - 相同的权限在app.manifest中,完全相同的代码以相同的方式调用(通过Timer)。唯一的区别是.NET 3.5 vs 4.0 - 但很明显,计数器,因为有多个应用程序可以看到它们,但是相同的数字却不能。

有没有人知道.NET 3.5和4.0之间的任何可能的区别会导致这种情况?或者为什么计数器可能对某些应用程序而不是其他应用程序可见?是否有一些我缺少的环境设置是.NET 4.0所必需的?目前我不知道去哪里进一步排除故障。

1 个答案:

答案 0 :(得分:2)

正如Hans Passant的评论所述,这个问题的答案是:

  

将EXE项目的平台目标设置从x86更改为AnyCPU

由OP确认:

  

我猜这意味着计数器只有64位?它还可以解释为什么某些应用程序能够或不能看到它们 - 基于它们所针对的平台。