2

我必须在 C#.net 中使用 Win32 类Win32_PrintJob,例如 等。Win32_Printer

我没有得到应该导入哪个命名空间以在我的 c#.net 应用程序中使用 Win32 类?

4

4 回答 4

2

这些是 WMI 类,因此您需要使用System.Management命名空间。

这是一篇关于打印机的好文章:使用 C# 和 WMI 以编程方式管理打印机

于 2012-12-20T06:11:56.790 回答
1

为了从 C#(或 .Net)访问 WMI,您必须导入System.Management 命名空间。此外,如果您是使用 WMI 的新手,请尝试使用类似的工具,WMI Delphi Code Creator它可以帮助您创建 C# 片段来访问 WMI。

试试这个由工具创建的示例代码。

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;

namespace GetWMI_Info
{
    class Program
    {

        static void Main(string[] args)
        {
            try
            {
                string ComputerName = "localhost";
                ManagementScope Scope;                

                if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase)) 
                {
                    ConnectionOptions Conn = new ConnectionOptions();
                    Conn.Username  = "";
                    Conn.Password  = "";
                    Conn.Authority = "ntlmdomain:DOMAIN";
                    Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn);
                }
                else
                    Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);

                Scope.Connect();
                ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_PrintJob");
                ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);

                foreach (ManagementObject WmiObject in Searcher.Get())
                {
                    Console.WriteLine("{0,-35} {1,-40}","Document",WmiObject["Document"]);// String
                    Console.WriteLine("{0,-35} {1,-40}","Name",WmiObject["Name"]);// String

                }
            }
            catch (Exception e)
            {
                Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
            }
            Console.WriteLine("Press Enter to exit");
            Console.Read();
        }
    }
}
于 2012-12-20T15:28:43.257 回答
1

尽管您尚未标记答案,但您可能正在寻找其他答案,为您提供 .NET 框架命名空间System.Management

但是,可能一直在阅读 WMI 文档并且您是从这个角度来的。基本概念之一是WMI 命名空间,它当然与 .NET 命名空间完全不同。所以这里有一个完全不同的答案,以防万一......


您可能需要的 #1 WMI 命名空间是root\cimv2. 仅当您深入挖掘时,您可能会使用root\subscription或某个公司选择的命名空间,该公司决定将自己的 WMI 提供程序放在“特殊”的某个地方。

通常,当您要连接到 WMI 命名空间时,它位于计算机名称之后,例如\\<computer>\root\cimv2. 本地连接时可以省略计算机,因此您只需输入名称空间路径,例如root\cimv2

在 .NET 中,您可以通过在字符串中使用 WMI 命名空间来构建一个ManagementPath,或在传递给ManagementScope构造函数的字符串中隐式使用它来指定 WMI 命名空间。

于 2012-12-20T22:20:52.013 回答
0

.NET 中确实实现了这样的对象,因此您不需要使用这些对象。
如果您必须直接使用 winapi,您可以创建一个包含 winapi 结构中包含的所有内容的结构(它们是结构,而不是类)。

一些注意事项:
保持所有成员的确切顺序和类型。
用 .表示句柄(例如 HWND 等)System.IntPtr
如果您需要传递结构的大小,请使用Marshal.SizeOf().
您还可以添加[StructLayout]属性,您可以在其中指定字符集和其他重要属性。
命名空间System.Runtime.InteropServices有一些常见的 winapi 结构。

于 2012-12-20T06:23:56.600 回答