Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы при работе с 2008 студией, падает devenv.exe в тестовой прилаге 
V
    Опции темы
Crimp
Дата 21.12.2007, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 21.10.2007
Где: Tula

Репутация: 1
Всего: 2



Подскажите, пожалуйста если кто сталкивался с данной проблемой.
проблему опишу в крадце, явно получится коряво, но по другому как smile заранее извиняюсь за сумбурность, я новичок и описать нормально я так думаю у меня не получится.
есть тестовое приложение, из под него стартует в отдельном потоке VisualStudio 2008 после того как студия отрабатывает положенное smile она благополучно закрывается. дальше начинаются чудеса smile если сразу после студии позвать devenv.exe ну например с задачей компильнуть какой нить solution. что то типо такого: 
Код


public class BuildCommand : Command {
        public BuildCommand(Parser parser)
            : base(parser) {
        }

        public override string Name { get { return "Build"; } }
        public override Status Run(params string[] parameters) {
            if (parameters.Length < 2) return new FailedStatus("Solution is not specified.");
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo.FileName = @"c:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.exe";
            proc.StartInfo.Arguments = "/rebuild Debug " +"\"" + Path.Combine(Parser.PathSolution, parameters[1]) + "\"";
            proc.StartInfo.WorkingDirectory = "c:\\Program Files\\Microsoft Visual Studio 8\\Common7\\IDE\\";
            string output, errors;
            if (!Parser.WaitForProcess(proc, 60 * 1000, out output, out errors))
                return new FailedStatus("Process timed out.", true);
            if (proc.ExitCode != 0) return new FailedStatus("\n" + output, true);
            return new OKStatus(!string.IsNullOrEmpty(output) ? "\n" + output : "");
        }
    }


public class Parser : IDisposable{
    public bool WaitForProcess(System.Diagnostics.Process proc, int timeOut, out string output, out string errors) {
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;
    string outstring = String.Empty, errorstring = String.Empty;
    proc.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e) { if(e.Data != null) outstring += e.Data + "\n"; };
    proc.ErrorDataReceived += delegate(object sender, DataReceivedEventArgs e) { if(e.Data != null) errorstring += e.Data + "\n"; };
    proc.Start();
    proc.BeginOutputReadLine();
    proc.BeginErrorReadLine();
    bool result = proc.WaitForExit(timeOut);
    if(!result)
        proc.Kill();
    output = outstring;
    errors = errorstring;
    return result;
    }
}
    

Так если, есть классы команды, каждый из них что то делает smile. они все запускаются в отдельном от управляющего приложения потоке. все гладко и чинно работает с 2005 студией smile но с 2008 творится что то не понятное, и не в потоках вроде дело падает в функции WaitForProcess на вызове proc.Start(); но при определённых условиях, тоесть если производить операций вызова и закрывания студии всё работает чинно, если после студии вызвать любую другую команду не обращающуюся к devenv.exe всё работает, но если сделать в последовательности: вызов студии, её закрытие, вызов devenv.exe то devenv падает. но падает тоже странно. если брякнуться перед выполнением proc.Start() запустить студию для дебага то всё работает нормально, можно даже сразу отпустить процесс, всё пройдёт гладко. также если после этой команды следующая также обращается к devenv то она уже работает нормально  smile, далее при падении на экран есно вываливается стандартная формочка с предложением отладки и тд. так вот если её не закрывать то есно она держит процесс и он в конецном счёте сваливается по таймеру
Код

bool result = proc.WaitForExit(timeOut);


также есть ешё интересные моменты. если выполнить это немного в другой последовательности. то есть: стартует студия, закрывается, вызываются команды не пользующие devenv, отрабатывают а далее идут команды использующие devenv то опять первая из них падает.
никаких Exception из proc.Start() выловить не получается так как в режиме дебага с другой студии всё проходит гладко, тем более что, если proc.Start() окружить try-catch никаких Exception из proc.Start() не вываливается :(
а вот ещё что. если запустить студию, затем её закрыть, а затем запустить опять студия стартует нормально, хотя это тоже devenv.exe

ниже приведу доп код может что подскажет

parser.Execute вызывается в цикле читающем команды из файла
Код


public Status Execute(string line) {
            if(string.IsNullOrEmpty(line)) return new ParserFailedStatus("Empty command");
            string[] lineParts = SplitLine(line);
            if(!Commands.Contains(lineParts[0])) return new ParserFailedStatus("Unknown command");
            Status res = null;
            Exception ex = null;
            action = delegate() {
                try {
                    res = Commands[lineParts[0]].Run(lineParts);
                } catch(Exception e) {
                    ex = e;
                }
            };
            const int step = 100;
            for(int i = 0; i < 15 * 60 * 1000; i += step) {
                if(action == null) {
                    if(ex != null)
                        return new FailedStatus("Exception: " + ex.ToString());
                    return res;
                }
                System.Threading.Thread.Sleep(step);
            }
            return new FailedStatus("Command timed out.");
        }



вот конструктор парсера

Код


public Parser() {
            visualStudio = new VisualStudio();
            thread = new System.Threading.Thread(delegate(object start) {
                while(!stop) {
                    if(action != null) {
                        action();
                        action = null;
                    }
                    System.Threading.Thread.Sleep(100);
                }
            });
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            System.Threading.Thread.Sleep(500);
        }


закрытие студии, вроде и тут лажы нет  smile 

Код

public class StopVisualStudioCommand : Command {
        public StopVisualStudioCommand(Parser tests) : base(tests) { }

        public override string Name { get { return "StopVS"; } }
        public override Status Run(params string[] parameters) {
            if(!VisualStudio.IsStarted) return new FailedStatus("Visual Studio is not started.");
            try {
                VisualStudio.Stop();
            } catch(Exception ex) {
                return new FailedStatus(ex, false);
            }
            return OKStatus.Default;
        }
    }

public void Stop() {
            if(!IsStarted) return;

            UnRegisterAddin();

            Application.Quit();
            MessageFilter.Revoke();
            application = null;
            versionStarted = 0;
            controlTester = null;
        }
void UnRegisterAddin() {
            if(File.Exists(AddinRegFile))
                File.Delete(AddinRegFile);
            Publish publish = new Publish();
            publish.GacRemove(AddinFileName);
        }

пока что грешу в сторону devenv.exe от 2008 студии. так как в 2005 всё пашет, да и тут для воспроизведения нужно выполнить определённую комбинацию, что на водит на мысли в сторону 2008 студии. 
Спасибо всем за ответы smile


PM MAIL ICQ   Вверх
stab
Дата 21.12.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



незнаю что не так с кодом и студией, могу лишь посоветовать взглянуть на MSBuild - http://rsdn.ru/article/devtools/msbuild-05.xml. для задач автоматизированной сборки это более подходящее средство.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Crimp
Дата 21.12.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 21.10.2007
Где: Tula

Репутация: 1
Всего: 2



Всё разобрались smile это реально глючина студии 2008 smile 

Это сообщение отредактировал(а) Crimp - 21.12.2007, 11:48
PM MAIL ICQ   Вверх
stab
Дата 21.12.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Crimp, и как решили проблему?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Crimp
Дата 22.12.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 21.10.2007
Где: Tula

Репутация: 1
Всего: 2



решить нормально не получается, придётся делать финт в виде подсовывания после закрытия студии билдёшку чиво нить левого, дальше нормально работать будет. а так получается бага студии 2008 :( нужна заплатка, так как не понятно что ему тут не нравится. так как если позле закрытия студии вызвать в консоли devenv для чего нить, но передать ему не верные входные пораметры то он запустится нормально и не упадёт, а если верные то падает, как уже писал 1 раз, далее нет, вплоть до полного повторения всех действий.

Это сообщение отредактировал(а) Crimp - 22.12.2007, 15:14
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.