6

我在查询 WMI 时遇到问题,这让我完全困惑。我正在构建的应用程序利用作为 VMware View Agent 的一部分安装到 VDI 桌面中的 WMI 计数器。计数器提供有关远程显示协议 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 应用程序,并且我使用了完全相同的代码 - 每次都会失败,并出现“无效类”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 中具有相同的权限,以相同的方式(通过计时器)调用完全相同的代码。唯一的区别是 .NET 3.5 与 4.0 - 但很明显,计数器存在,因为不止一个应用程序可以看到它们,但数量相等却不能。

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

4

1 回答 1

2

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

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

OP确认了这一点:

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

于 2014-02-02T20:56:07.177 回答