2013-02-11 109 views
6

我有一個問題查詢WMI讓我完全困惑。我正在構建的應用程序利用作爲VMware View代理的一部分安裝到VDI桌面的WMI計數器。這些計數器提供有關遠程顯示協議PCoIP的信息。從現有ManagementException - 無效的類

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代碼造物主內 - 什麼:

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需要的環境設置?目前,我不知道該如何解決這個問題。

+0

我也對機器運行了WMIDiag,它也報告PCoIP性能計數器存在。他們在機器上,但某些應用程序似乎無法找到它們。 – 2013-02-11 02:09:39

+5

我的水晶球說「將EXE項目的平臺目標設置從x86更改爲AnyCPU」。 – 2013-02-11 03:16:18

+0

就是這樣。虛幻。我猜這意味着計數器只有64位?這也將解釋爲什麼某些應用程序可以或不可以看到它們 - 基於它們的目標平臺。謝謝你,先生! – 2013-02-11 03:33:25

回答

2

正如Hans Passant在註釋中規定的這個問題的答案是:

變化EXE項目的平臺目標從86設置爲AnyCPU

這是由OP證實:

我想這意味着計數器只有64位?這也將解釋爲什麼某些應用程序可以或不可以看到它們 - 基於它們的目標平臺。