web-dev-qa-db-fra.com

Process.Start () ne démarre pas le fichier .exe (fonctionne à l'exécution manuelle)

J'ai un fichier .exe qui doit être exécuté après avoir créé un fichier. Le fichier est créé avec succès et j'utilise le code suivant pour exécuter le fichier .exe après cela:

ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = pathToMyExe;
processInfo.ErrorDialog = true;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardOutput = true;
processInfo.RedirectStandardError = true;                        
Process proc = Process.Start(processInfo);

J'ai aussi essayé avec une simple Process.Start(pathToMyExe); mais le fichier .exe n'est pas exécuté. Lorsque j'essaie pathToMyExe manuellement sur mon Explorateur Windows le programme est correctement exécuté. Mais pas via le programme. Ce que je vois, c’est que le curseur s’attend à attendre quelques secondes, puis revient à la normale. Donc, il n'y a pas d'exception non plus. Qu'est-ce qui bloque le fichier?

10
Disasterkid

Vous ne définissez pas le chemin du répertoire de travail et, contrairement au démarrage de l'application via Explorer, il n'est pas défini automatiquement sur l'emplacement de l'exécutable.

Faites juste quelque chose comme ça:

processInfo.WorkingDirectory = Path.GetDirectoryName(pathToMyExe);

(en supposant que les fichiers d'entrée, les DLL, etc. se trouvent dans ce répertoire)

19
Luaan
    private void Print(string pdfFileName)
    {
        string processFilename = Microsoft.Win32.Registry.LocalMachine
    .OpenSubKey("Software")
    .OpenSubKey("Microsoft")
    .OpenSubKey("Windows")
    .OpenSubKey("CurrentVersion")
    .OpenSubKey("App Paths")
    .OpenSubKey("AcroRd32.exe")
    .GetValue(string.Empty).ToString();

        ProcessStartInfo info = new ProcessStartInfo();
        info.Verb = "print";
        info.FileName = processFilename;
        info.Arguments = string.Format("/p /h {0}", pdfFileName);
        info.CreateNoWindow = true;
        info.WindowStyle = ProcessWindowStyle.Hidden;
        ////(It won't be hidden anyway... thanks Adobe!)
        info.UseShellExecute = false;

        Process p = Process.Start(info);
        p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

        int counter = 0;
        while (!p.HasExited)
        {
            System.Threading.Thread.Sleep(1000);
            counter += 1;

            if (counter == 5)
            {
                break;
            }
        }

        if (!p.HasExited)
        {
            p.CloseMainWindow();
            p.Kill();
        }
    }
1
clutch

En raison du répertoire de travail différent, vous devez définir correctement votre répertoire de travail sur le chemin que vous souhaitez que votre processus commence. 

Un exemple de démonstration de ceci peut être:

Process process = new Process()
{
    StartInfo = new ProcessStartInfo(path, "{Arguments If Needed}")
    {
        WindowStyle = ProcessWindowStyle.Normal,
        WorkingDirectory = Path.GetDirectoryName(path)
    }
};

process.Start();
0
Payam Lashkari