我在查询 WMI 时遇到问题,这让我完全困惑。我正在构建的应用程序使用 WMI 计数器,这些计数器作为 VMware View Agent 的一部分安装到 VDI 桌面中。计数器提供有关远程显示协议(protocol) 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 所需的环境设置?目前我不知道去哪里进一步解决这个问题。
最佳答案
如 Hans Passant 的评论所述这个问题的答案是:
change the EXE project's platform target setting from x86 to AnyCPU
由 OP 确认:
I would guess that means the counters are 64bit only? It would also explain why certain apps could or could not see them - based upon which platform they were targeted for.
关于c# - ManagementException - 无效类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14804761/