Ich versuche, die Registrierung aufzuzählen, um eine Liste der installierten Anwendungen abzurufen und sie über Linq an eine DataTable in C# zurückzugeben.C# Linq Registrierungswerte zu DataTable
Ich habe verschiedene Dinge ausprobiert, einschließlich der Desinfektion als XML (was funktionierte), aber es schien ziemlich ineffizient, da ich dies letztendlich als DataTable-Objekt benötige.
Hier ist, wo ich zur Zeit bin:
//Warning
public static DataRow DataRowInstalledApplication (this RegistryKey rgkey, string keyName)
{
RegistryKey key = rgkey.OpenSubKey(keyName, false);
try
{
//Application Name is mandetory for a given key.
if (key == null|| key.RegToString("DisplayName", false) == null)return null;
//Build a sanitised data row
var rowBuilder = new DataTable().NewRow();
rowBuilder["DisplayName"] = key.RegToString("DisplayName");
rowBuilder["UninstallString"] = key.RegToString("UninstallString");
rowBuilder["InstallLocation"] = key.RegToString("InstallLocation");
rowBuilder["Publisher"] = key.RegToString("Publisher");
rowBuilder["DisplayIcon"] = key.RegToString("DisplayIcon");
return rowBuilder;
}
finally
{
if (key != null) key.Close();
}
}
Hier ist die Methode, die die Linq enthält:
public DataTable GetRegistryApplicationDataTable(RegistryKey registryKey, string tableName)
{
if (registryKey != null)
{
try
{
//change to throw non critical error
var installedListXml = new DataTable(tableName, from name in registryKey.GetSubKeyNames()
let app = registryKey.DataRowInstalledApplication(name)
select app);
return installedListXml;
}
catch
{
return new DataTable(tableName);
}
finally
{
registryKey.Close();
}
}
return null;
}
Das Hauptproblem ich habe, ist, dass ich wirklich nicht Linq sehr gut verstehen . Hauptsächlich werden, wie einzelne Werte während der Iteration verwendet, um andere Dinge zu
ähnlich zu nennenforeach (string value in collection)
{
Somefunction(value);
}
im Fall der Registrierungswerte i abzurufen versuchen, ich verstehe nicht, wie eine Linq Abfrage jeden Schlüssel Namen übergibt machen zu funktionieren, die eine Zeile generieren und die Linq-Abfrage als Datentabelle zurückgegeben werden.
Ich wäre dankbar für alle Hinweise! Dank
ps Ich nenne die oben mit
private static readonly RegistryKey HKLMUninstallKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
GetRegistryApplicationDataTable(HKLMUninstallKey, "Computer")
und erwarten, dass eine Datentabelle zurück Computer genannt.
Vielen Dank für das Beispiel und die Erklärung, sehr hilfreich! – DIG