ManagementException – 无效的类

我有一个问题,询问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失败。

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

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

http://sofzh.miximages.com/c%23/perfmon.png

但是从WMI CIM Studio或WMI Code Creator中 – 没有:

http://sofzh.miximages.com/c%23/WMI_code_creator.png

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

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

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

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

由OP确认:

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