3

У меня есть макрос, который открывает решение, подключается к SourceSafe и загружает последнюю версию каждого файла внутри решения. К этому моменту все работает правильно.Visual studio 2008 macro для получения исходного кода

Теперь я хочу, чтобы выполнить devenv.exe с/командной опцией, чтобы запустить этот макрос и закройте среду Visual Studio, как только исходный код загружается, и в этот момент у меня возникают некоторые проблемы:

Если я используйте макрос, подобный тому, который следует этим строкам, запускает Visual Studio, загружает решение, начинает получать исходный код и затем выходит, не дожидаясь полной загрузки кода.

DTE.Solution.Open("C:\ApeironDev\Soluciones\SolucioApeiron\SolucioApeiron.sln") 
DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() 
DTE.ActiveWindow.Object.GetItem("SolucioApeiron").Select(vsUISelectionType.vsUISelectionTypeSelect) 
DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.ContextGetLatestVersion") 
DTE.ExecuteCommand("File.Exit") 

Если добавить строку в спящий макрос в течение некоторого времени, скажем, 20 минут, это происходит сбой с ошибкой относительно ошибки в COM вызова (я знаю, это не элегантный способ сделать эту работу, но чтобы проверить ...).

DTE.Solution.Open("C:\ApeironDev\Soluciones\SolucioApeiron\SolucioApeiron.sln") 
DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() 
DTE.ActiveWindow.Object.GetItem("SolucioApeiron").Select(vsUISelectionType.vsUISelectionTypeSelect) 
DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.ContextGetLatestVersion") 
Threading.Thread.Sleep(New System.TimeSpan(0, 20, 0)) 
DTE.ExecuteCommand("File.Exit") 

Что я ищу способ, чтобы начать Visual Studio, загрузите решение, получить последнюю версию исходного кода (в ожидании завершения процесса), а затем закройте среду Visual Studio. Любая помощь?

Разъяснение, Чтобы запустить макрос я использую следующую командную строку:

devenv.exe /command "Macros.MyMacros.SourceControl.GetLastVersion" 

Где Macros.MyMacros.SourceControl.GetLastVersion полный путь к макросу, содержащий код, приведенный выше описано.

ответ

1

тот факт, что я не нашел решение, которое искал, я, наконец, реализовал частичное решение. Не решение, которое я искал, а - самое изящное решение, но работает, и поскольку это временное решение ... ну лучше всего ничего.

Я использую следующий макрос:

Sub GestLastVersionOfSourceCode() 
    DTE.Solution.Open("C:\ApeironDev\Soluciones\SolucioApeiron\SolucioApeiron.sln") 
    DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() 
    DTE.ActiveWindow.Object.GetItem("SolucioApeiron").Select(vsUISelectionType.vsUISelectionTypeSelect) 
    DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.ContextGetLatestVersion") 

    'Wait for 2 minutes 
    For i As Integer = 0 To 2 
     Threading.Thread.Sleep(New System.TimeSpan(0, 1, 0)) 
    Next 
    DTE.ExecuteCommand("File.Exit") 
End Sub 

Этот макрос работает без проблем и дать весь исходный код перед закрытием среды.

По какой-то причине я не знаю, что цикл между командой, которая получает исходный код и команду, которая закрывает это решение, побуждает среду дождаться завершения команды get source, что не происходит, если я поместите команду exit непосредственно после команды получения исходного кода.

+0

http://stackoverflow.com/q/3923432/256431 может иметь значение. –

1

1) почему бы не сценарий SourceSafe сам? Для него есть инструмент командной строки
2) если вам не нужно закрывать VS, вы можете изменить параметры управления источником на «Всегда получать последнюю версию решения при загрузке» и не нуждаться в макросе

+0

Я не знаком с сценариями Sourcesafe, могу ли я использовать SourceSafe для получения последней версии не всего кода, а кода, связанного с конкретным файлом решения .sln? – Doliveras

+0

Хм, возможно, нет; он не понимает фактическую семантику файлов. Интересно, если вместо отправки «Выход», если вы просто отправите ключи «Alt + F4», улучшит ли это сбой. –

Смежные вопросы