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

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top