4
votes

Process.Start ("microsoft-edge:") lance Win32Exception dans dot net core

Lorsque j'exécute la ligne de code suivante:

Process.Start("explorer", @"shell:Appsfolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge");

Ou

Process.Start(@"c:\Windows\System32\LaunchWinApp.exe:http://localhost");
Process.Start(@"http://localhost");

Cela me donne cette erreur:

System.ComponentModel.Win32Exception: 'Le système ne trouve pas le fichier spécifié.'

Quand microsoft-edge: utilisant Win + R cela fonctionne.

Lorsque j'exécute le même code dans le framework .net, cela fonctionne.

J'utilise .netcore 3.0.0-preview6-27804-01

Une idée de pourquoi cela se produit?


Éditer:

Ceux-ci ne fonctionnent pas non plus:

Process.Start("microsoft-edge:http://localhost");

Tous les autres exécutables de mon système fonctionnent.

Cela fonctionne également, mais je ne peux pas ouvrir une page Web spécifique avec:

Process.Start("microsoft-edge:");


3 commentaires

Hou la la! un autre vote déraisonnable :-)


Malheureusement, aucune des réponses n'indique la cause profonde exacte, docs.microsoft.com/en-us/dotnet/api/… "La valeur par défaut est vraie sur les applications .NET Framework et false sur les applications .NET Core."


merci @LexLi cela signifie que la meilleure solution est de définir UseShellExecute = true


4 Réponses :


0
votes

La fenêtre d' Run Windows ( Win + R ) sait comment résoudre « microsoft-edge: » en chemin de l'exécutable. Lorsque vous l'appelez via la fenêtre Run , il se résout d'abord en chemin. Ensuite, l'exécutable réel de ce chemin est exécuté.

Avec Process.Start , il n'y a pas cette résolution de chemin. Il ne recherche que certains chemins tels que le chemin de l'application ou PATH variables PATH . Évidemment, il ne trouve pas l'exécutable à exécuter et donc l'erreur.

Si vous avez une variable de chemin déclarée dans votre système à l'aide de guillemets, vous devez entièrement qualifier ce chemin lors du démarrage de tout processus trouvé à cet emplacement. Sinon, le système ne trouvera pas le chemin. Par exemple, si c: \ mypath ne figure pas dans votre chemin et que vous l'ajoutez en utilisant des guillemets: chemin =% chemin%; "c: \ mypath", vous devez qualifier complètement tout processus dans c: \ mypath lors du démarrage.

La source

Notez que les paramètres de ligne de commande ne sont pas autorisés par cette surcharge:

Cette surcharge n'autorise pas les arguments de ligne de commande pour le processus. Si vous devez spécifier un ou plusieurs arguments de ligne de commande pour le processus, utilisez les surcharges Process.Start (ProcessStartInfo) ou Process.Start (String, String).


0 commentaires

4
votes

Vous ne pouvez pas simplement ouvrir une URL avec l'appel attendu Process.Start("url");

Vous devez créer un ProcessStartInfo et passer votre navigateur et votre URL en arguments:

public void OpenBrowser(string url)
{
    try
    {
        Process.Start(url);
    }
    catch
    {
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true });
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            Process.Start("xdg-open", url);
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
        {
            Process.Start("open", url);
        }
        else
        {
            throw;
        }
    }
}

(modifier) L'utilisation de ProcessStartInfo est requise car nous devons définir son CreateNoWindow = true pour empêcher la fenêtre cmd de s'afficher .

Mais comme ce code peut non seulement être exécuté sur une machine Windows, j'envisagerais d'utiliser quelque chose de plus spécifique à plusieurs plates-formes comme celui-ci ( https://brockallen.com/2016/09/24/process-start-for-urls- on-net-core / ):

Process.Start(new ProcessStartInfo("cmd", $"/c start microsoft-edge:http://localhost") { CreateNoWindow = true });

Et appelez-le avec OpenBrowser("http://localhost");


1 commentaires

Merci beaucoup! Cela m'aide beaucoup. Nous pouvons ajouter cette url = url.Replace ("&", "^ &"); avant Process.Start (new ProcessStartInfo ("cmd", $ "/ c start {url}") {CreateNoWindow = true}); Parce que cmd.exe reconnaîtra ^ & dans &.



1
votes

La cause profonde exacte est indiquée ici: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.useshellexecute?view=netframework-4.8

«La valeur par défaut est true sur les applications .NET Framework et false sur les applications .NET Core.»

Cela signifie que la solution directe consiste à définir UseShellExecute. Ce qui suit est fondamentalement le même que l'original, sauf en créant un objet Process explicite pour modifier un paramètre.

       Process pWeb = new Process();
       pWeb.StartInfo.UseShellExecute = true;
       pWeb.StartInfo.FileName = "microsoft-edge:http://localhost";
       pWeb.Start();

Merci à @Lex Li et @Bizhan pour leurs commentaires menant à cette solution.


0 commentaires

1
votes

Cette variante semble également faire l'affaire:

Process.Start(new ProcessStartInfo("msedge") { 
  UseShellExecute = true, 
  Arguments = "http://localhost" });

Cela évite l'étrangeté de la syntaxe microsoft-edge:<url> permettant ainsi de passer plus d'arguments de chrome de la manière habituelle.

Si quelqu'un connaît une raison d'éviter cela, n'hésitez pas à parler :)


0 commentaires