【问题标题】:ManagementException - Invalid ClassManagementException - 无效的类
【发布时间】:2013-01-26 02:51:29
【问题描述】:

我在查询 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 是否需要一些我缺少的环境设置?目前我不知道去哪里进一步解决这个问题。

【问题讨论】:

  • 我还对机器运行了 WMIDiag,它还报告 PCoIP 性能计数器存在。它们在机器上,但某些应用程序似乎找不到它们。
  • 我的水晶球说“将 EXE 项目的平台目标设置从 x86 更改为 AnyCPU”。
  • 就是这样。虚幻。我猜这意味着计数器只有 64 位?它还将解释为什么某些应用程序可以或看不到它们 - 基于它们的目标平台。谢谢楼主!

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


【解决方案1】:

正如Hans Passant 在 cmets 中所述,这个问题的答案是:

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

由 OP 确认:

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

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2019-11-18
    • 2019-09-18
    相关资源
    最近更新 更多