VS Package - как получить все файлы из солюшин
От: AlexNek  
Дата: 06.09.20 21:59
Оценка:
Данный код даёт только cs файлы и то больше чем надо
Ни XAML, ни .Resx, ни всего что еще есть в проектах не выдает

IComponentModel componentModel = _package.GetService<SComponentModel, IComponentModel>();
            
var workspace = componentModel.GetService<VisualStudioWorkspace>();

foreach (Project project in solution.Projects)
{
   foreach (Document document in project.Documents)
   {
     ...
   }
}


Пример файлов из простейшей консоли
Program.cs, ConsoleApp1\ConsoleApp1\Program.cs
ConsoleApp1.AssemblyInfo.cs, ConsoleApp1\ConsoleApp1\obj\Debug\netcoreapp2.1\ConsoleApp1.AssemblyInfo.cs
.NETCoreApp,Version=v2.1.AssemblyAttributes.cs,ConsoleApp1\ConsoleApp1\obj\Debug\netcoreapp2.1\.NETCoreApp,Version=v2.1.AssemblyAttributes.cs
Re: VS Package - как получить все файлы из солюшин
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 15.09.20 07:56
Оценка:
Здравствуйте, AlexNek, Вы писали:

Прошу прощения за задержку, скорее всего вы уже разобрались, но на всякий случай переспрошу.
AN>
AN>IComponentModel componentModel = _package.GetService<SComponentModel, IComponentModel>();
            
AN>var workspace = componentModel.GetService<VisualStudioWorkspace>();

AN>foreach (Project project in solution.Projects)
AN>{
AN>   foreach (Document document in project.Documents)
AN>   {
AN>     ...
AN>   }
AN>}
AN>


Не видя общего примера судить сложно, но предположу, что вы работаете с Roslyn-овской моделью солюшена, в которой есть только файлы понятные компиляторам Roslyn (т.е. .cs, .vb и что-то там до кучи).

Если же вы хотите добраться до полного солюшена, вам нужно работать через объекты самой студии. Если мне не изменяет память схема примерно такая:
— как сервис (GetService(...)) получаете интерфейс DTE
— у него получаете текущий Solution
— перебираете Projects, а в них ProjectItems

Единственное, я не пробовал это делать с новой моделью проектов, но вроде там обещали обратную совместимость, а модель проектов всё равно прячется внутри.
Re[2]: VS Package - как получить все файлы из солюшин
От: AlexNek  
Дата: 15.09.20 09:51
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, AlexNek, Вы писали:


МР>Прошу прощения за задержку, скорее всего вы уже разобрались, но на всякий случай переспрошу.

AN>>
AN>>IComponentModel componentModel = _package.GetService<SComponentModel, IComponentModel>();
            
AN>>var workspace = componentModel.GetService<VisualStudioWorkspace>();

AN>>foreach (Project project in solution.Projects)
AN>>{
AN>>   foreach (Document document in project.Documents)
AN>>   {
AN>>     ...
AN>>   }
AN>>}
AN>>


МР>Не видя общего примера судить сложно, но предположу, что вы работаете с Roslyn-овской моделью солюшена, в которой есть только файлы понятные компиляторам Roslyn (т.е. .cs, .vb и что-то там до кучи).


МР>Если же вы хотите добраться до полного солюшена, вам нужно работать через объекты самой студии. Если мне не изменяет память схема примерно такая:

МР>- как сервис (GetService(...)) получаете интерфейс DTE
МР>- у него получаете текущий Solution
МР>- перебираете Projects, а в них ProjectItems

МР>Единственное, я не пробовал это делать с новой моделью проектов, но вроде там обещали обратную совместимость, а модель проектов всё равно прячется внутри.

Спасибо большое, да с DTE можно получить всё.
Мне казалось что новая модель пришла на замену. Тем более что синтакическое дерево тоже нужно будет, хочется найти определенный элемент и заменить его (ну и свзь с редактором кода не потерять).

Еще вот не искал чем студия парсит XAML, там тоже надо будет найти элементы и заменить часть кода. Может быть знаете?
Re[3]: VS Package - как получить все файлы из солюшин
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 15.09.20 11:00
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>Спасибо большое, да с DTE можно получить всё.

AN>Мне казалось что новая модель пришла на замену. Тем более что синтакическое дерево тоже нужно будет, хочется найти определенный элемент и заменить его (ну и свзь с редактором кода не потерять).
На сколько я понимаю, нет, модель Workspaces в Roslyn, идет в параллель (и наверное это логично — зачем, им те же элементы XAML, или вообще какой-нибудь custom item — они ведь всё равно не смогут с ним ничего сделать, и этот элемент остается на совести системы сборки).
Вообще надо смотреть, на общую задачу — что именно вы хотите сделать.

Потому что до кода можно добраться несколькими путями:
— через модель Roslyn
— через CodeModel в VisualStudio (другой вопрос — через неё много не сделаешь).

AN>Еще вот не искал чем студия парсит XAML, там тоже надо будет найти элементы и заменить часть кода. Может быть знаете?

Увы...
Я даже подозреваю, что у самой студии ничего публичного для работы с XAML нет. У них даже обычный редактор XML расширить — это скачки на одной ноге (я в свое время смотрел, как это делал Мадс Кристенсен — и повторят даже пытаться не стал).
Я просто исхожу из того, что:
— для чистой работы с XAML есть пространство System.Xaml (хотя там по-моему далеко не всё, я просто помню, что народ, который пытался портировать Workflow Foundation на Core уперся именно в XAML. Хотя сейчас может всё и лучше).
— для расширений редакторов, которые манипулируют XAML предусмотрены свои Extensions в каждой технологии (типа Aborners в WPF)

Но поискать можно. Только скорее всего это будет "подпольный" вариант
Re[4]: VS Package - как получить все файлы из солюшин
От: AlexNek  
Дата: 15.09.20 12:09
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, AlexNek, Вы писали:


AN>>Спасибо большое, да с DTE можно получить всё.

AN>>Мне казалось что новая модель пришла на замену. Тем более что синтакическое дерево тоже нужно будет, хочется найти определенный элемент и заменить его (ну и свзь с редактором кода не потерять).
МР>На сколько я понимаю, нет, модель Workspaces в Roslyn, идет в параллель (и наверное это логично — зачем, им те же элементы XAML, или вообще какой-нибудь custom item — они ведь всё равно не смогут с ним ничего сделать, и этот элемент остается на совести системы сборки).
МР>Вообще надо смотреть, на общую задачу — что именно вы хотите сделать.

ну например, найти все регионы и отредактировать их содержание и в cs и в XAML. Это просто пример
Re[2]: VS Package - как получить все файлы из солюшин
От: AlexNek  
Дата: 16.09.20 20:30
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, AlexNek, Вы писали:




МР>Не видя общего примера судить сложно, но предположу, что вы работаете с Roslyn-овской моделью солюшена, в которой есть только файлы понятные компиляторам Roslyn (т.е. .cs, .vb и что-то там до кучи).


МР>Если же вы хотите добраться до полного солюшена, вам нужно работать через объекты самой студии. Если мне не изменяет память схема примерно такая:

МР>- как сервис (GetService(...)) получаете интерфейс DTE
МР>- у него получаете текущий Solution
МР>- перебираете Projects, а в них ProjectItems

МР>Единственное, я не пробовал это делать с новой моделью проектов, но вроде там обещали обратную совместимость, а модель проектов всё равно прячется внутри.

Добраться до синтаксического дерева из DTE пока не получается, приходится в параллель делать
Re[4]: VS Package - как получить все файлы из солюшин
От: bnk СССР http://unmanagedvisio.com/
Дата: 16.09.20 20:41
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Я даже подозреваю, что у самой студии ничего публичного для работы с XAML нет. У них даже обычный редактор XML расширить — это скачки на одной ноге (я в свое время смотрел, как это делал Мадс Кристенсен — и повторят даже пытаться не стал).


Может быть и есть. Только вот с публичностью и документацией реально проблема.
XML я сам парсил для автокомплита через Microsoft.XmlEditor.dll (он свой для каждой студии, и документации так-то негусто). Добывается через:

_xmlLanguageService = (XmlLanguageService)_serviceProvider.GetService(typeof(XmlLanguageService));

https://github.com/nbelyh/IdMsoAutocomplete
https://github.com/nbelyh/IdMsoAutocomplete/blob/master/IdMsoAutocomplete/CompletionSupport/CompletionSource.cs

Возможно через него же можно и XAML, но то оно точно без удобств и это все достаточно жостко как-то..

Вообще помогает поиск по GitHub, по исходникам во многих случаях, если найти open-source аналого того, что ты хочешь сделать.
Отредактировано 16.09.2020 20:42 bnk . Предыдущая версия .
Re[3]: VS Package - как получить все файлы из солюшин
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 17.09.20 07:57
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>Добраться до синтаксического дерева из DTE пока не получается, приходится в параллель делать

А из DTE и не получится, скорее всего. DTE ведь в этой части не дорабатывали бог знает сколько лет.
И обратное (из Workspace в объекты DTE) тоже мало вероятно — на сколько я помню у Roslyn весь API никак не завязан на студию.

Т.е., скорее всего особо вариантов-то и нет — только сверять на уровне путей к файлам (кстати а так работает?)
Re[5]: VS Package - как получить все файлы из солюшин
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 17.09.20 08:05
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>ну например, найти все регионы и отредактировать их содержание и в cs и в XAML. Это просто пример

Сильно конкретнее не стало, но, наверное, я понял. Что-то типа "есть XAML и парный ему рукописный C# код и надо автоматом поменять в обоих местах"?

Ну в таком варианте, наверное, да, просто не сделать иначе.

Т.е. если бы можно было бы свести к варианту "Меняем XAML, а потом допиливаем кодогенерацию по нему", можно было бы посмотреть другие варианты.
Re[6]: VS Package - как получить все файлы из солюшин
От: AlexNek  
Дата: 17.09.20 11:50
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, AlexNek, Вы писали:


AN>>ну например, найти все регионы и отредактировать их содержание и в cs и в XAML. Это просто пример

МР>Сильно конкретнее не стало, но, наверное, я понял. Что-то типа "есть XAML и парный ему рукописный C# код и надо автоматом поменять в обоих местах"?

из cs нужно добыть ABC и редактировать его
#region ABC
#end region


из ХАМЛа тоже самое, связи между ними нет

МР>Ну в таком варианте, наверное, да, просто не сделать иначе.


МР>Т.е. если бы можно было бы свести к варианту "Меняем XAML, а потом допиливаем кодогенерацию по нему", можно было бы посмотреть другие варианты.

Не, cs и XAML совершенно независимы, просто как в коде через Рослин сделать понятно, а с XAML надо возится.
Просто Рослин еще линию и колонку в файле выдает, можно будет в редакторе нужное место подсветить.
Re[5]: VS Package - как получить все файлы из солюшин
От: AlexNek  
Дата: 17.09.20 11:53
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, Михаил Романов, Вы писали:


МР>>Я даже подозреваю, что у самой студии ничего публичного для работы с XAML нет. У них даже обычный редактор XML расширить — это скачки на одной ноге (я в свое время смотрел, как это делал Мадс Кристенсен — и повторят даже пытаться не стал).


bnk>Может быть и есть. Только вот с публичностью и документацией реально проблема.

bnk>XML я сам парсил для автокомплита через Microsoft.XmlEditor.dll (он свой для каждой студии, и документации так-то негусто). Добывается через:

bnk>
bnk>_xmlLanguageService = (XmlLanguageService)_serviceProvider.GetService(typeof(XmlLanguageService));
bnk>

bnk>https://github.com/nbelyh/IdMsoAutocomplete
bnk>https://github.com/nbelyh/IdMsoAutocomplete/blob/master/IdMsoAutocomplete/CompletionSupport/CompletionSource.cs

bnk>Возможно через него же можно и XAML, но то оно точно без удобств и это все достаточно жостко как-то..


bnk>Вообще помогает поиск по GitHub, по исходникам во многих случаях, если найти open-source аналого того, что ты хочешь сделать.

Спасибо, пару линков давное еще нашел, но там что то свое написано, надеялся что MS удостоился подумать о разарботчиках
Но приведенную ссылку ни за что бы не нашел
Re[4]: VS Package - как получить все файлы из солюшин
От: AlexNek  
Дата: 17.09.20 11:57
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, AlexNek, Вы писали:


AN>>Добраться до синтаксического дерева из DTE пока не получается, приходится в параллель делать

МР>А из DTE и не получится, скорее всего. DTE ведь в этой части не дорабатывали бог знает сколько лет.
МР>И обратное (из Workspace в объекты DTE) тоже мало вероятно — на сколько я помню у Roslyn весь API никак не завязан на студию.

МР>Т.е., скорее всего особо вариантов-то и нет — только сверять на уровне путей к файлам (кстати а так работает?)

Похоже что работает, но пути нужно сохранять. Хотя надо еще подумать, может быть можно только локально это делать если больше не понадобится.

Теперь следущий этап — связь с редактором и изменение кода
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.