Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,012
1

Ошибка с путями при запуске другой программы

10.01.2016, 14:01. Показов 851. Ответов 10
Метки нет (Все метки)

Есть программа_1 написанная на c#. Обычным двойным щелчком программа_1 запускается без ошибок.
Я хочу запустить программу_1 из другой программы (программы_2).

Код программы_2 - выполняется в фоновом потоке first_laught_thread
C#
1
2
3
Process.Start("program\\TelerikWinFormsApp1.exe"); //Запускаем программу_1
//first_laught_thread.Abort(); //Завершение потока не помогает. Да и поток должен сам завершиться при Application.Exit() - он же фоновый
Application.Exit();
В результате запускается программа_1. Пока все хорошо.
Но далее запущенная программа 1 выдает текст ошибки-исключения. Исключение возникает если не найден путь к файлу.
Но все файлы есть и все пути верные. Проверял многократно.
Код программы_1
C#
1
2
3
4
5
6
7
try
{
xmlDoc.Load("handbook_files\\SB\\SB.xml");
......//Тут часть кода
}
catch (System.IO.DirectoryNotFoundException) //Вот это срабатывает при вызове из программы 1.
{ this.Invoke(new Action(() => { show_error_message("Ошибка. Не найден путь к справочнику SB.xml."); }));}
Почему при обычном вызове не возникает никаких ошибок, а при вызове из другой программы возникает исключение?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.01.2016, 14:01
Ответы с готовыми решениями:

Ошибка при запуске другой программы через ShellExecute
Доброго всем! если не трудно помогите, вот уже 2 дня голова болит из за ошибки. Делаю я отдельную...

Ошибки при запуске программы из другой программы - неверная рабочая директория
Вот у меня есть несколько программ написанных под VisualBasic.net. После чего, я создаю спец...

В чем ошибка? При запуске программы открывается консоль и сразу ошибка о завершении программы
К тому же выдает warning: deprecated conversion from string constant to 'char*' . #include...

Выбор другой формы при запуске программы
Здравствуйте. При создании программы и дальнейшем её запуске возникает форма, которая создавалась...

10
Модератор
Эксперт .NET
5306 / 4102 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
10.01.2016, 14:05 2
useruser, попробуйте переписать путь. Типа такого:
string pathToFile=Path.Combine(AppDomain.CurrentDomain.BaseDirector y, "SB.xml");
1
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,012
10.01.2016, 14:30  [ТС] 3
Цитата Сообщение от insite2012 Посмотреть сообщение
useruser, попробуйте переписать путь. Типа такого:
string pathToFile=Path.Combine(AppDomain.CurrentDomain.BaseDirector y, "SB.xml");
Хорошо. Попробую. Изменил часть путей. Часть ошибок (catch) исчезли.
Похоже, ваш ответ верен. Спасибо.

Это очень странно, что одна и та же программа, в зависимости от её вызова, по разному воспринимает пути.
По вашему коду я вижу, что вы написали абсолютный путь. Но вы его не указываете явно (c:\1.txt), а формируете - получаете путь до exe файла.
Но путь может быть также и относительным.

У меня пути относительные.
Почему программа не хочет воспринимать относительные пути при её вызове из стороннего приложения?
Мне теперь везде использовать абсолютный путь (Path.Combine(AppDomain.......) при обращении к любому файлу
0
Модератор
Эксперт .NET
5306 / 4102 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
10.01.2016, 14:33 4
Цитата Сообщение от useruser Посмотреть сообщение
я вижу, что вы написали абсолютный путь. Но путь может быть также и относительным.
Все зависит от точки зрения. У меня он тоже относительный, относительно базовой директории базового домена приложения.
0
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,012
10.01.2016, 15:26  [ТС] 5
Цитата Сообщение от insite2012 Посмотреть сообщение
У меня он тоже относительный, относительно базовой директории базового домена приложения.
Не соглашусь.
Вы формируете - создаете абсолютный путь. Собираете его из "объектов", объединяете эти объекты.
Вы формируете путь от корня системы. В данном случае от AppDomain.CurrentDomain.
Подобное "формирование пути" есть во многих языках программирования.
Но это не важно. Пускай будет любой путь или даже любой код приложения.

Мне до сих пор не ясно, почему приложение работает по разному, в зависимости от его вызова. Мы просто запускаем приложение. Без параметров, ключей и т.д.
Если я написал код с ошибкой - пускай эта ошибка будет, вне зависимости от того, как мы вызываем приложение.
Вызвали приложение - оно начало работу. Как его вызвали, что его вызвало не должно влиять на результат выполнения кода приложения.

Сейчас я вижу, что написав код приложения особым образом - при обычнов вызове я получу работающее приложение, при вызове из другого приложения - ошибку.

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

Значит исполнение кода приложения, написанного на с# зависит от типа вызова этого приложения?
Вызвали двойным щелчком - один результат.
Вызвали из другого приложения - другой результат.
Это странно.
0
Администратор
Эксперт .NET
13178 / 10732 / 4427
Регистрация: 17.03.2014
Сообщений: 21,637
Записей в блоге: 1
10.01.2016, 15:35 6
Цитата Сообщение от useruser Посмотреть сообщение
Мне до сих пор не ясно, почему приложение работает по разному, в зависимости от его вызова.
Потому что отличается "текущий" (или по другому рабочий) каталог.

Цитата Сообщение от useruser Посмотреть сообщение
Значит исполнение кода приложения, написанного на с# зависит от типа вызова этого приложения?
Нет. Это значит что не нужно использовать относительные пути не понимая относительно чего они отсчитываются. При запуске из проводника "текущий" каталог совпадает с каталогом где находится приложение и ошибок нет. При запуске из другой программы, "текущий" каталог какой-то другой и программа не работает. Вина за эти ошибки лежит на запускаемой программе. Единственный правильный способ это исправить - конструировать полный путь как посоветовал insite2012.

Цитата Сообщение от useruser Посмотреть сообщение
Это странно.
Нет, это логично и закономерно.
1
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,012
10.01.2016, 16:00  [ТС] 7
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Нет. Это значит что не нужно использовать относительные пути не понимая относительно чего они отсчитываются.
А как в с# указать, относительно чего они отсчитываются?
Как я понял, моя ошибка в том, что я считаю что по умолчанию относительный путь отсчитывается от вызываемого объекта.
В php и Delphi относительный путь отсчитывается относительно скрипта или выполняемого exe файла.

PHP
1
2
$path=$_SERVER['DOCUMENT_ROOT'] . '/includes/foobar.php'; //Путь относительно корневой директории
$path_1='/includes/foobar.php'; //Путь относительно этого файла
В с# как то по другому?
0
Администратор
Эксперт .NET
13178 / 10732 / 4427
Регистрация: 17.03.2014
Сообщений: 21,637
Записей в блоге: 1
10.01.2016, 16:17 8
Цитата Сообщение от useruser Посмотреть сообщение
А как в с# указать, относительно чего они отсчитываются?
Environment.CurrentDirectory или Directory.SetCurrentDirectory(), но лучше так не делать.

Цитата Сообщение от useruser Посмотреть сообщение
Как я понял, моя ошибка в том, что я считаю что по умолчанию относительный путь отсчитывается от вызываемого объекта.
Твоя ошибка что ты думаешь что относительный путь всегда отсчитывается относительно каталога с приложением. В реальности это иногда так, иногда иначе.

Цитата Сообщение от useruser Посмотреть сообщение
В Delphi относительный путь отсчитывается относительно выполняемого exe файла.
Это не так. Для всех приложений под Windows действуют одни и те же правила. Язык программирования роли не играет.

Цитата Сообщение от useruser Посмотреть сообщение
В php относительный путь отсчитывается относительно скрипта
PHP
1
2
$path=$_SERVER['DOCUMENT_ROOT'] . '/includes/foobar.php'; //Путь относительно корневой директории
$path_1='/includes/foobar.php'; //Путь относительно этого файла
В первой строке формируется абсолютный путь. Это эквивалентно решению с Path.Combine+BaseDirectory. Что касается второй строки, то неплохо бы помнить что веб-приложения и настольные приложения строятся совершенно по разному. Сравнивать одно с другим нет смысла.
0
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,012
10.01.2016, 17:09  [ТС] 9
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В реальности это иногда так, иногда иначе.
Значит вывод такой - во всех дестопных приложениях, всегда формировать путь к любым объектам относительно корневой директории?
Типа
Цитата Сообщение от insite2012 Посмотреть сообщение
ath.Combine(AppDomain.CurrentDomain.BaseDirectory, "SB.xml");
0
Администратор
Эксперт .NET
13178 / 10732 / 4427
Регистрация: 17.03.2014
Сообщений: 21,637
Записей в блоге: 1
10.01.2016, 17:35 10
useruser, корневая директория это C:\, D:\, E:\ и т.д. Нам же нужна директория приложения. С учетом этой поправки делаем вывод - нужно всегда явно формировать полный путь чтобы не было сюрпризов.
0
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,012
10.01.2016, 17:49  [ТС] 11
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Нам же нужна директория приложения
Зачем? Она меняется в зависимости от вызова программы. Что я и увидел, на своем примере.
Директория приложения это ведь Рабочий каталог? При создании нового процесса, он наследует рабочий каталог родительского процесса.
Когда я вызывал программу двойным кликом - мой рабочий каталог был каталог этой программы. До вызова программы не было процесса. Все работало.
Когда я вызывал программу из другой программы - эта другая программа (процесс) "передала свой рабочий каталог" вызываемой программе.
И если бы обе программы находились в одном каталоге - все было бы хорошо, но программы находились в разных. Что и вызвало ошибку относительных путей.
Я так это понимаю.

А вот путь к любым объектам относительно корневой директории не меняется в зависимости от вызова программы.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
нужно всегда явно формировать полный путь чтобы не было сюрпризов
Вы хотели сказать - нужно всегда формировать относительный путь, относительно корневого каталога системы?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2016, 17:49

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Не выполняется часть кода при автозагрузке/запуске из другой программы
Здравствуйте. Столкнулся с такой проблемой: есть программа, прописанная в автозапуск, которая...

Ошибка в конструкторе с параметром. Компилятор не ругается, но при запуске программы возникает ошибка
Я знаю точно, что ошибка в конструкторе с параметром. Компилятор не ругается, но при запуске моей...

Ошибка при запуске программы
Здравствуйте, разбираюсь в проекте скачанный с github https://github.com/Malemm/ml-graphology...

Ошибка при запуске программы.
Создаю простейшее приложение - стандартная форма, Edit1 и Button1. Все работает нормально. Но если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.