Introducción
En mi anterior artículo explicaba la forma de agregar una nueva opción de menú a uno ya existente, dentro de un Addin para Visual Studio.
Siguiendo un poco con el tema de “extender” Visual Studio, vamos a ver como podemos obtener los distintos tipos de proyecto de una determinada versión de Visual Studio. (En el siguiente artículo, veremos como agregar un proyecto a una solución existente).
Código
Aunque he publicado el código en Code MSDN, me gustaría exponerlo aquí y explicarlo brevemente:
En primer lugar, será necesario que obtengamos el directorio donde se encuentra instalada la versión de Visual Studio que vamos a comprobar:
1: private void GetVSFolder()
2: {
3: string VSVersion = VSVersions.GetVSVersion(Version);
4: string folder = String.Format("{0}{1}",RegistryPath,VSVersion);
5: InstallationFolder = Registry.GetValue(folder, "InstallDir", "").ToString();
6: }
Dada una versión de Visual Studio, y la ruta de Registro de Windows “HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio”, vamos a obtener el valor de la clave “Install Dir”, y la asignaremos a una propiedad de nuestra clase.
Dentro del código vamos a tener un enumerador de las distintas versiones de VS y un diccionario (Dictionary<string,string>) con la pareja versión y Nombre largo. La versión es el valor que vamos a utilizar para poder obtener el directorio de Instalación.
La clase va a contener una Propiedad de tipo Lista de cadenas (List<string>) que va a contener las distintas agrupaciones para los proyectos (WEB, CSharp, VisualBasic…). Para obtener dichos valores:
1: private void GetProjectTypes()
2: {
3: if (String.IsNullOrWhiteSpace(InstallationFolder)) throw new Exception("El Directorio de Visual Studio no puede estar vacio.");
4: ProjectType = new List<string>();
5: foreach(var folder in System.IO.Directory.EnumerateDirectories(String.Format(@"{0}ProjectTemplates",InstallationFolder)))
6: {
7: if (!ProjectType.Contains(folder)) ProjectType.Add(folder);
8: }
9:
10: }
Para tratar las distintas plantillas, he definido una clase “ProjectTemplate”:
1: public class ProjectTemplate
2: {
3: public string TemplateName { get; set; }
4: public string TemplatePath { get; set; }
5: public string ProjectType { get; set; }
6: public override string ToString()
7: {
8: return String.Format("{0} - {1}", ProjectType, TemplateName);
9: }
10: }
Y dentro de la clase una propiedad de tipo Lista (List<ProjectTemplate>), que rellenaremos de la siguiente manera:
1: private void GetProjectTemplates()
2: {
3: if (String.IsNullOrWhiteSpace(InstallationFolder)) throw new Exception("El Directorio de Visual Studio no puede estar vacio.");
4: ProjectTemplates = new List<ProjectTemplate>();
5:
6: foreach (var file in System.IO.Directory.EnumerateFiles(String.Format(@"{0}ProjectTemplates", InstallationFolder),"*"
7: ,System.IO.SearchOption.AllDirectories))
8: {
9: var possition = file.IndexOf("ProjectTemplates")+17;
10: ProjectTemplates.Add( new ProjectTemplate {
11: TemplatePath = file,
12: TemplateName = file.Substring(file.LastIndexOf(@"")+1),
13: ProjectType = file.Substring(possition,file.IndexOf(@"",possition))
14: }
15: ) ;
16:
17: }
18: }
Para utilizar este proyecto, bastaría con agregar la referencia a un nuevo proyecto, y para poder probarlo:
1: VSInfo.VSInfo vs = new VSInfo.VSInfo(VSInfo.eVSVersions.VS2010);
2: foreach (var template in vs.ProjectTemplates)
3: {
4: Console.WriteLine(template.ToString());
5: }
Espero que os sea de utilidad.
Saludos
Introducción En un post anterior vimos como definir un nuevo elemento en el Menú contextual de la Solución
Introducción Antes de comenzar a hablar del propio titulo, vamos a hacer un índice de los artículos publicados