我目前正在编写一个小程序,必须远程控制某些设备(他们的服务和硬件,如Lan端口)。我用Google搜索并阅读了很多关于WMI的信息,现在我正在努力制作我的程序。
但我找不到Win32_NetworkAdapter类的引用名称空间。我已经将System.Management和Microsoft.Win32导入到项目中,但SDK仍然告诉我无法找到Win32_NetworkAdapter。
我在这里缺少什么?
PS。我正在使用Windows XP,VS Express 2010 Express for dev。
感谢您的帮助。
这是我的代码atm:
string manage = "SELECT * From Win32_NetworkAdapter";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(manage);
ManagementObjectCollection collection = searcher.Get();
foreach (ManagementObject obj in collection)
{
if (obj["Name"].ToString() != null)
{
if (obj["Name"].ToString() == "Realtek RTL8168C(P)/8111C(P) PCI-E Gigabit Ethernet NIC")
{
obj.InvokeMethod("Disable", null);
textBox3.Text += "finished";
}
}
}
我在调试模式下运行它,我发现obj的属性(Classpath,Options,Path,Scope)显示错误消息:
由于先前的功能评估,功能评估被禁用 时间到。您必须继续执行以重新启用功能 评价。
任何想法?
答案 0 :(得分:3)
WMI“类”不是C#意义上的类。他们选择了这个名词,因为他们类似于一个类。它们有一个名称,属性和方法,就像C#类一样。
它是一个COM界面。这也解释了你得到的调试器警告,COM接口具有线程关联性。调试器在单独的线程(调试器线程)上计算监视表达式。当断点处于活动状态时会出现死锁,调试器会冻结访问接口的线程。这不是一个真正的问题,只是给您带来不便。
目前尚不清楚您遇到了什么样的问题,如果Win32_NetworkAdapter查询未返回某些内容,您将无法获得调试器警告。获取名称出现错误的可能性,请注意您的代码如何只能偶然在另一台机器上运行。并且WMI确实往往是片状的,它严重依赖于驱动程序来返回信息并且驱动程序不是平等的。它们的质量大致与您在硬件上花费的金额成正比。到目前为止,实验和测试WMI查询的最佳方法是使用WMI Code Creator utility。它允许您执行任意查询,甚至可以选择自动生成所需的C#代码。强烈推荐。
答案 1 :(得分:1)
您可以使用@Wiktor Zychla建议使用它们,使用mgmtclassgen.exe生成强类型C#类。另请参阅此SO question/answer以获取有关该主题的更多信息和链接。
答案 2 :(得分:0)
您不要在C#中使用WMI类作为类。而是将类名传递给WMI查询方法:
var search = new ManagementObjectSearcher( "SELECT * FROM Win32_NetworkAdapter" );