// Définition de variable d'aide
var protocolUri = new Uri("InfiniteSquare://", UriKind.Absolute);
var packageFamilyName = "MonIdDePackage";
var fileUri = new Uri("ms-appx:///NousAInfiniteSquare.file");
var file = await StorageFile.GetFileFromApplicationUriAsync(fileUri);
 
var result = await Launcher.QueryUriSupportAsync(
      protocolUri, LaunchUriType.LaunchUri, packageFamilyName);
 
if (result != QueryUriSupportStatus.Success)
{
    // opération non concluante
    return false;
}
 
// On lance une app spécifique
LauncherOptions options = new LauncherOptions();
options.TargetApplicationPackageFamilyName = packageFamilyName;
 
// On lui donne un fichier
ValueSet inputData = new ValueSet();
var fileToken = SharedStorageAccessManager.AddFile(file);
inputData.Add("FileToken", fileToken);
 
// On attends le résultat
var launchResult = await Launcher.LaunchUriForResultsAsync(
    protocolUri, options, inputData);
 
if (launchResult.Status != LaunchUriStatus.Success)
{
    // opération non concluante
    return false;
}
 
//lecture du résultat
var retourDeLautreApp = launchResult.Result
    .FirstOrDefault(k => k.Key == "Resultat").Value;

protected override void OnActivated(IActivatedEventArgs args)
{
    if (args.Kind == ActivationKind.ProtocolForResults)
    {
        Frame rootFrame = Window.Current.Content as Frame;
         
        // Créer la frame si elle n'existe pas
         
        // navigation classique en passant le paramètre
        // d'activation
        rootFrame.Navigate(typeof(MainPage), args);
 
    }
    base.OnActivated(args);
}

private ProtocolForResultsActivatedEventArgs _activationArgs;
 
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
 
    // Stockage du paramètre dans le bon type
    _activationArgs =
        e.Parameter as ProtocolForResultsActivatedEventArgs;
}
 
public void ReturnResult()
{
    // Création du résultat, on pourrait aussi renvoyer
    // un fichier via un token (comme à l'aller)
    var returnedData = new ValueSet();
    returnedData.Add("MonResultat", "Un objet ici");
 
    // On retourne le résultat à l'application originale
    _activationArgs.ProtocolForResultsOperation
        .ReportCompleted(returnedData);
}

using (var appServiceConn = new AppServiceConnection())
{
    //Configuration pour cibler la bonne app
    appServiceConn.AppServiceName = "NousAInfiniteSquareAppService";
    appServiceConn.PackageFamilyName = "PackageFamilyNameDeLAppli";
 
    //Ouverture de la connection
    var status = await appServiceConn.OpenAsync();
 
    //On peut savoir si l'app est installée aussi
    if (status != AppServiceConnectionStatus.Success)
    {
        return;
    }
 
    //Définition du message
    var message = new ValueSet();
    message.Add("Command", "Dis bonjour");
 
    //Envoi du message
    var resp = await appServiceConn.SendMessageAsync(message);
 
    if (resp.Status != AppServiceResponseStatus.Success)
    {
        //Message d'erreur
    }
}

//Abonnement à la reception d'une requete
appServiceInfo.AppServiceConnection.RequestReceived
    += AppServiceConnection_RequestReceived;
 
//Récupération du deferral pour le service
_seviceDeferral = taskInstance.GetDeferral();

private async void AppServiceConnection_RequestReceived
    (AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
    var requestDeferral = args.GetDeferral();
 
    //lecture de la commande
    var commande = args.Request.Message.FirstOrDefault(k => k.Key == "Command");
 
    switch (commande.Value as string)
    {
        case "Dis bonjour":
            var response = new ValueSet();
            response.Add("response", "bonjour");
            await args.Request.SendResponseAsync(response);
            break;
        case "Quit":
 
            //Fin du service
            _seviceDeferral.Complete();
            break;
    }
 
    //Fin de la requete
    requestDeferral.Complete();
}