Obter uma lista de arquivos de solução / projeto para VS Add-in ou DXCore Plugin
-
07-07-2019 - |
Pergunta
Eu estou tentando escrever um add-in para o Visual Studio que, entre outras coisas, precisa manter o controle de todos os arquivos em uma solução Visual Studio. Eu sei o que os eventos que eu preciso assinar (quando uma solução é aberto, quando um arquivo é adicionado / removido / editado na mesma, o mesmo para projetos, etc), mas eu não entendo como para realmente obter uma lista de arquivos de nada disso.
Eu instalei recentemente CodeRush e foram brincar com o quadro DXCore. Estou muito feliz com a sua abordagem em plugins, mas eu ainda não vejo uma maneira óbvia para obter uma lista de arquivos na solução.
Assim, para resumir:? Como, por meio do Visual Studio SDK ou DXCore, posso obter uma lista confiável de arquivos na solução e é projetos
Solução
Esta é tudo disponível facilmente usando DTE no Visual Studio SDK.
Você pode obter uma lista de projetos em uma solução usando o interface de Projetos .
Você pode obter uma lista de itens em um projeto usando o Interface ProjectItem .
Para obter mais informações, eu recomendo ler sobre controle de projetos e soluções .
Outras dicas
Obrigado, Reed; o artigo é ligada tem me longe o suficiente para obter uma prova de conceito agitado em alguns minutos.
Uma vez que eu sinto que é relacionado, aqui é a iteração e meios recursiva pelo qual eu coletei os ProjectItems. Eu fiz isso em DXCore, mas a mesma idéia se aplica à matéria-Visual Studio SDK (DXCore é apenas um mais bonito wrapper sobre o SDK). A 'Solução', 'projetos', 'Projeto', e objetos 'ProjectItem' estão ali em EnvDTE.
Configuração de Projetos
EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution;
EnvDTE.Projects projects = solution.Projects;
iteração sobre os Projetos de puxar ProjectItems
var projects = myProjects.GetEnumerator();
while (projects.MoveNext())
{
var items = ((Project)projects.Current).ProjectItems.GetEnumerator();
while (items.MoveNext())
{
var item = (ProjectItem)items.Current;
//Recursion to get all ProjectItems
projectItems.Add(GetFiles(item));
}
}
Por fim, a recursão eu faço para conseguir que todos ProjectItems na solução ativa
ProjectItem GetFiles(ProjectItem item)
{
//base case
if (item.ProjectItems == null)
return item;
var items = item.ProjectItems.GetEnumerator();
while (items.MoveNext())
{
var currentItem = (ProjectItem)items.Current;
projectItems.Add(GetFiles(currentItem));
}
return item;
}
Consulte EnvDTE: Obter todos os projetos (o SolutionFolder PITA)
Esta solução funciona brilhantemente para obter todos os projetos na solução, mesmo que os projetos estão em subpastas.
Certifique-se de ler os comentários abaixo o código, uma vez que aponta uma correção essencial, usar isso para pegar DTE2 em vez do código original, ou então ele não recebe a instância correta do Visual Studio:
DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
(o código foi atualizado para incluir acima correção)