【发布时间】:2011-01-07 20:44:05
【问题描述】:
首先,此代码在 VS2005 中有效。
每当我尝试跨过 foreach 循环并分配 ManagementObject 时,VS2008 中的代码就会崩溃并出现 UnauthorizedAccessException。
public static List<string> GetPrintersCollection() {
if (printers == null) {
printers = new List<string>();
string searchQuery = "SELECT * FROM Win32_Printer";
try {
using (ManagementObjectSearcher searchPrinters = new ManagementObjectSearcher(searchQuery)) {
ManagementObjectCollection Printers = searchPrinters.Get(); // <= Printers data below
foreach (ManagementObject printer in Printers) { // <= Error Here
printers.Add(printer.Properties["Name"].Value.ToString());
}
}
} catch (UnauthorizedAccessException err) {
Console.WriteLine(err.Message); // the message is an empty string
throw new Exception("PrinterSpool - GetPrintersCollection: You do not have authorization to access this printer.");
} catch (Exception err) {
throw new Exception(string.Format("PrinterSpool - GetPrintersCollection: {0}", err.Message));
}
}
return printers;
}
堆栈跟踪 =
在 System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
在 System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()
在 AcpClasses.PrinterSpool.GetPrintersCollection()...
当我尝试在 Locals 窗口中查看数据时,这些字段看起来很可疑:
1. 计数 - 值:“函数评估超时。”
2. IsSynchronized - 值:函数评估已禁用,因为之前的函数评估超时。
3. SyncRoot - 值:函数评估被禁用,因为之前的函数评估超时。
如何尝试进一步调试以了解发生了什么?
【问题讨论】:
-
注释:在别处定义的是 List
printers = null;此代码在 Visual Studio 2005 中也不再适用(我刚刚检查了一个仅查询 Win32_Printer 的控制台应用程序)。 -
我在答案中添加了一些代码,应该有助于诊断您的问题。
标签: c# visual-studio-2008 object