Я пытаюсь запустить приложение (операционная система, мое приложение и приложение, которое я хочу запустить, все 32-разрядные), из .NET 3.51.
Код, запускающий процесс, используется для других приложений, но есть один, который вызывает у нас головную боль. Если мы «дважды щелкнем» по значку приложения, оно будет работать как положено, что означает, что оно отлично работает как приложение на компьютере. Двойной щелчок по .exe напрямую, также работает.
Операционная система Windows 7 32-битная (Домашняя и / или Профессиональная).
Наше приложение .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;
}
Я не знаю, кто написал этот метод, но он работал около шести лет с различными приложениями, поэтому я предполагаю, что это «хорошо». Однако у нас есть клиент с программным обеспечением, которое не запустится, если пройти через этот аргумент.
Аргументы: :
- process - это System.Diagnostics.Process, созданный с помощью простого «new Process ();»
- путь - полный путь к файлу .exe «c: /path/to/my.exe».
- enableRaisingEvents false
- windowStyle развернуто (но пробовали другие).
Это дает дурацкий MessageBox… который я счастливо увековечил. Он на испанском, но перевод должен быть легким:
Там написано:
Ошибка приложения
Неожиданное исключение произошло для программы (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:
Это означает, что «Программа не может быть запущена из-за отсутствия ddip.dll… попробуйте переустановить bla bla».
Дело в том, что если я выполню тот же @path из командной строки, программа откроется идеально:
Это открывает программу. И то же самое происходит, если я нажимаю на «ярлык», который находится в меню «программы». В этом ярлыке нет никаких параметров, это простой вызов исполняемого файла.
Итак, вопрос сейчас: В чем разница между моим кодом и другими методами?
Должно быть что-то другое, что заставляет мой процесс не запускаться.
Есть идеи?
ОБНОВЛЕНИЕ И РЕШЕНИЕ
Я сделал это, используя один из приведенных ниже ответов. Оказывается, никто не указал мне прямо на решение, но все они дали мне хорошие идеи здесь и там.
Я добавил манифест приложения в наше приложение (оно должно было быть с возраста Vista, не знаю, почему его не было на первом месте) Манифест приложения, который я добавил с помощью VStudio 2008 add file -> манифест приложения.
В нем я убедился, что у нас есть это:
<requestedExecutionLevel level=“asInvoker” uiAccess=“false” />
Нам не нужен админ или любой другойвещь такая, но, видимо, Vista / 7 нужно это знать.
После этого процесс корректно запускается.
note : UseShellExecute имеет значение true по умолчанию (как предлагают некоторые), вы должны явно включить его в false, если вы этого хотите.