Oi pessoal,
Descobri uma coisa interessante sobre as macros do Visual Studio, além do VBA também é possivel acessar essas mesmas classes a partir do .NET =P
Em qualquer versão do VS, você pode ir até o menu Tools > Macros e criar scripts para automatizar tarefas. Praticamente todas as funcionalidades do VS estão representadas lá. Só que sabemos que o VBA é uma linguagem limitada, seria bom poder acessar essas classes a partir do C# por exemplo. Por isso a Microsoft disponibilizou as classes COM+ das macros em assembly, assim você pode adicionar a referência a elas nos seus projetos em .NET.
As principais assemblies que você precisa adicionar referência são:
EnvDTE – Contém as funcionalidade do Visual Studio 2003
EnvDTE80 – Contém as funcionalidade do Visual Studio 2005
EnvDTE90 – Contém as funcionalidade do Visual Studio 2008
Como nem tudo é perfeito, algumas dicas para você não apanhar no desenvolvimento com essas bibliotecas:
- Elas não são nativas do .NET, são apenas wrappers em cima das dlls COM+. Os seja, prepare-se para deparar com exceptions bizarras vindo de dentro do COM+.
- Não existe documentação/comentários no IntelliSense, procure no MSDN.
- A nomenclatura e a forma de instanciação dos objetos não é intuitiva. Por exemplo, Solution é a classe que representa as solutions no VS 2003, Solution2 as solutions VS 2005, e Solution3 no VS2008. Para instanciar uma Solution3 não funciona um “new Solution3()“, você tem que fazer um cast a partir da classe original Solution:
// Obtem uma instancia do Visual Studio 2008
DTE2 objDTE = (DTE2)System.Activator.CreateInstance(System.Type.GetTypeFromProgID(“VisualStudio.DTE.9.0″, true), true);
// Obtem uma instancia da Solution
Solution3 objSolution = (Solution3)objDTE.Solution;
- Algumas coisas seguem o padrão do VB, nas collections (se você estiver no C#) não é possivel acessar um item usando colchetes e o indice não começa do zero e sim do um. Isso impede o foreach funcionar em cima dessas collections. Exemplo a collection de projetos da solution:
// Retorna o nome do primeiro projeto da solution
string strPrjName = objSolution.Projects.Item(1).Name;
Tirando essas dificuldades, as possibilidades são muitas, você pode desenvolver em C# por exemplo, um gerador automático de solutions e projetos com as camadas e namespaces já no seus padrões.
Abraços!