[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 を使用して満足しています (私はそうではありません)。まだそれらをテストするプログラマーとして十分に精通しています)。
誰かが何か指針を持っているなら、私はそれを感謝します。ありがとう...