3

[C# .NET Windows フォーム WMI]

私は C# の初心者ですが、VBScript の経験があり、作成したスクリプトを C# に変換しようとしています。コンバーターを使用するだけでなく、コードを書き直し、学習を支援するためにコードを最適化しようとしています。

少し背景

元の VBScript では、次のコードを使用してリモート サーバーに接続します。

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, "root\cimv2", strUserName, strPassword)
objSWbemServices.Security_.ImpersonationLevel = wbemImpersonationLevelImpersonate

次に、探しているプリンターのリストをループして、次のコードを持つ関数を呼び出します。

Set colPorts = objConnection.ExecQuery("SELECT * FROM Win32_Printer WHERE Name = '" & strPrinter & "'")  

If colPorts.Count = 0 Then
    Set objPort = objConnection.Get("Win32_TCPIPPrinterPort").SpawnInstance_

インスタンスが生成された後、任意の文字列値を持つ Dictionary オブジェクトに必要なプロパティを追加します。このオブジェクトには、検索しているプリンターがキー、プロパティが値として含まれます。そのため、サーバーから切断するまでに、そのサーバーから使用する必要があるすべてのプリンターを含む単一の辞書オブジェクトを取得します (ポートでも同じことを行います)。

C# では、ManagementObjectSearcher を使用して ManagementObjectCollection を返すことができるため、辞書を使用する必要はないようです。次に、これを正しく理解すれば、必要な特定のプリンターに必要なプロパティを単一の ManagementObject から取得するか、PropertyData にドリルダウンできるはずです。ここまで私と?

問題/機会

コレクション全体を返すので、LINQ を使用して、コレクション全体をループするのではなく、使用する必要がある特定のプリンターを見つける方が効率的であると考えました。次に、LINQ から ManagementObject を取得したら、後で使用するために PropertyData を変数に割り当てるか (可能であると仮定)、PropertyData をループして内容を表示します (主にデバッグ用)。

私は運なしで次のコードで後者を試しました:

var printer = from ManagementObject x in mocPrinters
                      where x.Properties["Name"].Value.ToString() == "MyHP"
                      select x;

foreach (PropertyData p in printer)
{
    MessageBox.Show(string.format("{0}: {1}", p.Name, p.Value);
}

私のプリンターが PropertyData 型ではないため、上記のコードは機能しませんでした。

その他の役立つ情報

コレクション全体を返した後に LINQ を使用してクエリを実行する方が、WMI/WQL を使用してクエリを実行するよりも高速であると考えていましSELECT * FROM Win32_Printer WHERE Name = 'MyHP'たが、誰かがこれをテストして、パフォーマンスの違いがごくわずかであることを知っていれば、私は WMI/WQL を使用して満足しています (私はそうではありません)。まだそれらをテストするプログラマーとして十分に精通しています)。

誰かが何か指針を持っているなら、私はそれを感謝します。ありがとう...

4

1 に答える 1