2013-07-26 55 views
0
  • 我讀過所有相關的答案,這裏都沒有幫助。
  • 另請注意:如果我在VS 2012調試器中運行該程序,它就像一個魅力。 但是,如果我運行時未經調試(按Ctrl F5)或在VS 2012 ID之外運行.exe,則會引發異常。
  • 我turened關閉防火牆
  • 我運行exe文件管理
  • 我重新啓動WMI服務。

相同..ManagementObjectSearcher Get()方法:「內存不足以繼續執行程序。」

這裏是代碼。通過.Get()方法調用拋出異常

注意:調試屏幕是而不是運行調試模式,它是運行可執行文件並在崩潰後連接調試器。

http://screencast.com/t/nfvrfz2Hq6Q

同樣,如果我在調試運行程序越跑起來的魅力。

internal static class Program 
{ 
    private static void Main(string[] args) 
    { 
     var objSearcher = new ManagementObjectSearcher(
      "SELECT * FROM Win32_SoundDevice"); 

     var objCollection = objSearcher.Get(); 

     foreach (var obj in objCollection) 
     { 
      foreach (var property in obj.Properties) 
      { 
       Debug.WriteLine("{0}:{1}", property.Name, property.Value); 
      } 
     } 
    } 
} 
+0

只是爲了反饋:任何人都可以複製嗎? Thx –

+0

如果* real *代碼重複運行此查詢,則OOM是此代碼的預期結果。這需要一段時間。否則,使用實現IDisposable的類的典型結果不會使用Dispose()方法,也不會使垃圾收集器運行得足以在您之後清理。然而,這些都是非常相關的細節,你沒有解決你的問題,所以這不是一個解釋。 –

+0

嗨漢斯,thx的評論。代碼運行一次。這裏真的很可怕,在VS IDE調試模式下,它運行良好並且發現了2個設備,但是運行可執行文件(或者在IDE中使用ctrl + f5運行)會立即拋出內存不足。 :-(我沒有希望了 –

回答

0

是我可以重現它,你的問題應該是權限,以管理員身份運行程序,在我的情況下它的工作。

0

這是因爲「選項」被設置爲默認模擬。

請嘗試以下

internal static class WmiQuery 
{ 
    public static ManagementScope getWmiConnection(string ipAddress, string username = "", string password = "", string domain = "") 
    { 
     //New ConnectionOptions. 
     ConnectionOptions options = new ConnectionOptions(); 
     bool isLocalhost = (ipAddress.ToLower() == "localhost" || ipAddress == "127.0.0.1"); 
     //ConnectionOptions'Properties invullen. 
     options.Impersonation = isLocalhost ? ImpersonationLevel.Default : ImpersonationLevel.Impersonate; 
     options.Username = string.Format(@"{0}\{1}", domain, username); 
     options.Password = password; 

     ManagementScope scope = isLocalhost 
      ? new ManagementScope("\\\\" + ipAddress + "\\root\\cimv2") 
      : new ManagementScope("\\\\" + ipAddress + "\\root\\cimv2", options); 

     return scope; 
    } 

    public static ManagementObjectCollection SearcherGet(this ManagementScope scope, string query) 
    { 
     //Query system for Operating System information 
     if (!scope.IsConnected) scope.Connect(); 
     var queryResult = new ManagementObjectSearcher(scope, new ObjectQuery(query)).Get(); 
     return queryResult; 

    } 

    public static void DoWork() 
    { 
     var wmiConn = WmiQuery.getWmiConnection("localhost"); 
     ManagementObjectCollection results = wmiConn.SearcherGet("SELECT * FROM Win32_SoundDevice"); 

     foreach (var soundDevice in results) 
      foreach (var sdProperty in soundDevice.Properties) 
       Console.WriteLine("{0}:{1}", sdProperty.Name, sdProperty.Value); 
    } 
} 

現在只需撥打:

WmiQuery.DoWork(); 
相關問題