Entwickeln mit Q# und .NET

Die Q# Programmiersprache ist so aufgebaut, dass sie gut mit .NET-Sprachen wie C# und F# zusammenarbeitet. In diesem Leitfaden wird veranschaulicht, wie Sie Q# mit einem in einer .NET-Sprache geschriebenen Hostprogramm verwenden.

Zunächst erstellen wir die Q#-Anwendung und den .NET-Host und veranschaulichen dann, wie Q# über den Host aufgerufen wird.

Voraussetzungen

Erstellen einer Q#-Bibliothek und eines .NET-Hosts

Der erste Schritt ist die Erstellung von Projekten für Ihre Q#-Bibliothek und für den .NET-Host, von dem Aufrufe für die in Ihrer Q#-Bibliothek definierten Vorgänge und Funktionen durchgeführt werden.

Folgen Sie den Anweisungen auf der Registerkarte, die Ihrer Entwicklungsumgebung entspricht. Wenn Sie einen anderen Editor als Visual Studio oder VS Code verwenden, befolgen Sie einfach die Schritte für die Eingabeaufforderung.

  • Erstellen Sie eine neue Q#-Bibliothek.

    dotnet new classlib -lang Q# -o quantum
    
  • Erstellen Sie ein neues C#- oder F#-Konsolenprojekt.

    dotnet new console -lang C# -o host  
    
  • Fügen Sie Ihre Q#-Bibliothek als Verweis aus Ihrem Hostprogramm hinzu.

    cd host
    dotnet add reference ../quantum/quantum.csproj
    
  • [Optional] Erstellen Sie eine Projektmappe für beide Projekte.

    dotnet new sln -n quantum-dotnet
    dotnet sln quantum-dotnet.sln add ./quantum/quantum.csproj
    dotnet sln quantum-dotnet.sln add ./host/host.csproj
    

Durchführen von Q#-Aufrufen über .NET

Nachdem Sie Ihre Projekte gemäß der obigen Anleitung eingerichtet haben, können Sie über Ihre .NET-Konsolenanwendung Q#-Aufrufe durchführen. Der Q#-Compiler erstellt .NET-Klassen für alle Q#-Vorgänge und -Funktionen, die das Ausführen von Quantenprogrammen in einem Simulator ermöglichen.

Das Beispiel zur .NET-Interoperabilität enthält das folgende Beispiel für einen Q#-Vorgang:

/// Instantiates the oracle and runs the parameter restoration algorithm.
operation RunAlgorithm(bits : Bool[]) : Bool[] {
    Message("Hello, quantum world!");
    // construct an oracle using the input array
    let oracle = ApplyProductWithNegationFunction(bits, _, _);
    // run the algorithm on this oracle and return the result
    return ReconstructOracleParameters(Length(bits), oracle);
}

Um diesen Vorgang über .NET in einem Quantensimulator aufzurufen, können Sie die Methode Run der .NET-Klasse RunAlgorithm verwenden, die vom Q#-Compiler generiert wird:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static System.Diagnostics.Debug;

using Microsoft.Quantum.Simulation.Core;
using Microsoft.Quantum.Simulation.Simulators;

namespace Microsoft.Quantum.Samples
{
    static class Program
    {
        static async Task Main(string[] args)
        {
            var bits = new[] { false, true, false };
            using var sim = new QuantumSimulator();

            Console.WriteLine($"Input: {bits.ToDelimitedString()}");

            var restored = await RunAlgorithm.Run(sim, new QArray<bool>(bits));
            Console.WriteLine($"Output: {restored.ToDelimitedString()}");

            Assert(bits.Parity() == restored.Parity());
        }

        static bool Parity(this IEnumerable<bool> bitVector) =>
            bitVector.Aggregate(
                (acc, next) => acc ^ next
            );

        static string ToDelimitedString(this IEnumerable<bool> values) =>
            String.Join(", ", values.Select(x => x.ToString()));
    }
}

Nächste Schritte

Nachdem Sie das Quantum Development Kit nun sowohl für Q#-Anwendungen als auch für die Interoperabilität mit .NET eingerichtet haben, können Sie Ihr erstes Quantenprogramm schreiben und ausführen.