Проблема с запуском System.Diagnostics.Process в Windows 7

Я пытаюсь запустить приложение (Операционная система, Мое приложение и приложение, которое я хочу запустить, имеют 32 бита) из .NET 3.51.

Код, запускающий процесс, используется для других приложений, но есть один, который доставляет нам головную боль. Если мы «дважды щелкнем» по значку приложения, оно будет работать должным образом, а это означает, что оно отлично работает как приложение на компьютере. Также работает двойной щелчок по файлу .exe.

Операционная система - Windows 7 32Bits (Home и / или Professional).

Наш. NET-приложение скомпилировано с x86, чтобы избежать проблем.

Код, запускающий «Процессы», расположен внутри созданной нами DLL (также 32-битной), в основном это простая DLL, которая содержит некоторый «Общий код» по всем направлениям, общие методы, функции и прочее, которое мы используем в нашем код. Один из этих методов выглядит так:

public static bool FireUpProcess( Process process, string path, bool enableRaisingEvents,
        ProcessWindowStyle windowStyle, string arguments )
    {
        if ( process != null )
        {
            try
            {
                process.StartInfo.FileName = @path;
                if ( arguments != null )
                {
                    if ( arguments != String.Empty )
                    {
                        process.StartInfo.Arguments = arguments;
                    }
                }
                process.StartInfo.WindowStyle = windowStyle;
                process.EnableRaisingEvents = enableRaisingEvents;
                process.Start();
            }
            catch
            {
                try
                {
                    process.Kill();
                }
                catch ( InvalidOperationException )
                {
                } // The process is not even created

                return false;
            }
        }
        else
        {
            return false;
        }
        return true;
    }

Я не знаю, кто написал этот метод, но он работает уже около шести лет с различными приложениями, поэтому я предполагаю, что это «нормально». Однако у нас есть клиент с программным обеспечением, которое не запускается при передаче через этот аргумент.

Аргументы: :

  1. процесс - это System.Diagnostics.Process, созданный с помощью простого «new Process ();»
  2. путь - это полный путь к .exe «c: /path/to/my.exe».
  3. enableRaisingEvents false
  4. windowStyle Максимизировано (но пробовали другие).

Он дает дрянной MessageBox… который я с радостью увековечил. Оно на испанском, но перевод должен быть простым:

alt text

Там написано:

Ошибка приложения Неожиданное исключение произошло для программы (0x0eedfade) в…

Погуглил, что 0x0eedfade дает странные результаты, которые выглядят пугающими, но правда в том, что если я перейду к .exe, который пытаюсь запустить, и дважды щелкну по нему, работает отлично.

Для записи : если я пытаюсь запустить другие программы (например, Notepad.exe, Adobe Acrobat Reader), он работает, , но Firefox не открывается и не выдает ошибку .

Такое поведение «что-то работает, что-то нет» наводит меня на мысль, что может быть проблема с механизмом безопасности Windows 7 или аналогичным, которого я не знаю.

Что я упускаю или делаю неправильно?

ОБНОВЛЕНИЕ : Хорошо; Я получил копию программы. Это беспорядочная программа, но она работает. Теперь, когда я могу отлаживать, я вижу, что программа выдает ошибку при запуске с моим методом FireUpProcess .

Как и было предложено, я добавил код WorkingDirectory, но вот код:

    public static bool FireUpProcess(Process process, string path, bool enableRaisingEvents, ProcessWindowStyle windowStyle)
    {
        if (process != null)
        {
            try
            {
                if ( !String.IsNullOrEmpty(@path) )
                {
                    process.StartInfo.FileName = @path;
                    process.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(@path);
                    process.StartInfo.WindowStyle = windowStyle;
                    // Suscribe to the exit notification
                    process.EnableRaisingEvents = enableRaisingEvents;
                    // Disable to prevent multiple launchs
                    Framework.Check.LogWarning("LAUNCHING EXTERNAL DEVICE WITH PATH: " + path);
                    process.Start(); // HERE The program reports the following:

alt text

Это означает: «Программа не может быть запущена из-за отсутствия ddip.dll… попробуйте переустановить bla bla».

Дело в том, что если Я выполняю тот же @path из командной строки, программа открывается отлично:

alt text

Это открывает программу. То же самое происходит, если я нажимаю на «ярлык», который находится в меню «Программы». В этом ярлыке нет никаких параметров, это простой вызов исполняемого файла.

Итак, теперь вопрос: В чем разница между моим кодом и другими методами?

Должно быть что-то другое, что заставляет мой процесс не запускаться.

Есть идеи?

ОБНОВЛЕНИЕ И РЕШЕНИЕ

Я заставил его работать, используя один из приведенных ниже ответов. Оказывается, никто прямо не указал мне на решение, но все они предлагали мне хорошие идеи здесь и там.

Я добавил манифест приложения в наше приложение (он должен был быть у него с эпохи перспективы, не знаю, почему его не было на первом месте). Манифест приложения, который я добавил с помощью VStudio 2008 add file -> app manifest.

В нем я убедился, что у нас есть следующее:

<requestedExecutionLevel level=“asInvoker” uiAccess=“false” />

Нам не нужен администратор или что-то в этом роде, но, очевидно, Vista / 7 должна это знать.

После того, как это было добавлено, процесс запускается правильно.

примечание : UseShellExecute имеет значение true по умолчанию (как предлагают некоторые), вы должны явно установить для него значение false, если вы этого хотите.

5
задан Martin Marconcini 9 December 2010 в 10:15
поделиться