WinRT in "klassischen" .NET-Anwendungen nutzen

Der Dotnet-Doktor  –  10 Kommentare

Die neue COM-basierte Windows Runtime (WinRT) Library kann man nicht nur in den Windows 8-Metro-Anwendungen, sondern auch in "klassischen", mit .NET geschriebenen Desktop-Anwendungen nutzen. Allerdings laufen dann solche Anwendungen nur unter Windows 8 – insofern nicht Microsoft seine Meinung noch mal ändert und WinRT doch auch für ältere Betriebssysteme anbietet.

Das folgende Beispiel zeigt eine Dateisuche mit Windows (Desktop) Search, implementiert in .NET 4.5 mit C# 5.0 und unter Verwendung von zwei WinRT-Komponenten: Windows.Storage.dll und Windows.Storage.Search.dll.

Im "Add Reference"-Dialog der Visual Studio 11 Developer Preview wird man keine WinRT-Komponenten finden. Um eine Referenz auf WinRT-Komponenten zu setzen, referenziert man derzeit die .winmd-Dateien in c:\Windows\System32\WindowsMetadata. Wie die meisten WinRT-Funktionen ist auch diese Funktion nur durch eine asynchrone Operation ausführbar.

static void Main(string[] args)
{
Console.WriteLine("Starte");
DateiSuchDemo();
Console.WriteLine("Warte");
while (true) { Console.Write("."); System.Threading.Thread.Sleep(1000); }
}

/// <summary>
/// Suche ausführen mit Windows Search auf Basis der WinRT-Bibliothek
/// Windows.Storage.Search.dll
/// Auch eine Referenz auf Windows.Storage.dll wird benötigt.
/// </summary>
private static void DateiSuchDemo()
{
// Suche definieren
var docs = Windows.Storage.KnownFolders.DocumentsLibrary;
var queryOptions = new Windows.Storage.Search.QueryOptions();
queryOptions.FolderDepth = Windows.Storage.Search.FolderDepth.Deep;
queryOptions.IndexerOption = Windows.Storage.Search.
IndexerOption.UseIndexerWhenAvailable;
queryOptions.UserSearchFilter = "'iX Magazin'";
// Suche starten
var query = docs.CreateFileQueryWithOptions(queryOptions);
var aktion = query.GetFilesAsync();
aktion.Completed += DateiSucheFertig;
aktion.Start();
Console.WriteLine("Suche beginnt..");
}

/// <summary>
/// Suchergebnisse empfangen und ausgeben
/// </summary>
private static void DateiSucheFertig
(IAsyncOperation<IReadOnlyList<IStorageFile>> r)
{
Console.WriteLine("SearchCompleted/Status: " + r.Status);
if (r.Status != AsyncStatus.Error)
{
Console.WriteLine("Gefundene Dateien: " + r.GetResults().Count);
foreach (var f in r.GetResults())
{
Console.WriteLine(f.FileName);
}
}
}