2013-10-17 18 views
12

ile nasıl bulunur Visual Studio için özel bir araç geliştiriyorum. Araç dosyaya atandığında, dosyanın değiştiği anda bu dosyanın adını alıyorum ve projede bazı değişiklikler yapmam gerekiyor. Alınan dosya adıyla bir ProjectItem bulmalıyım. Çözümün her projesinde tüm proje kalemlerini sıralayan tek bir çözüm buldum. Ama büyük bir çözüm gibi görünüyor. Bir proje öğesi numaralandırma olmadan dosya adına göre bir yolu var mı?ProjectItem dosya adı

Bu IVsSingleFileGenerator

public int Generate(string sourceFilePath, string sourceFileContent, string defaultNamespace, IntPtr[] outputFileContents, out uint output, IVsGeneratorProgress generateProgress) 
{ 
    var dte = (EnvDTE.DTE)Package.GetGlobalService(typeof(EnvDTE.DTE)); 

    ProjectItem projectItem = null; 

    foreach (Project project in dte.Solution.Projects) 
    { 
     foreach (ProjectItem item in project.ProjectItems) 
     { 
      var path = item.Properties.Item("FullPath").Value; 
      if (sourceFilePath.Equals(path, StringComparison.OrdinalIgnoreCase)) 
      { 
       projectItem = item; 
      } 
     }    
    } 

    output = 0; 
    outputFileContents[0] = IntPtr.Zero; 

    return Microsoft.VisualStudio.VSConstants.S_OK; 
} 
+0

Açık değil: sln dosyasını ayrıştırıyor ve sonra her csproj'u ayrışıyor musunuz? Yoksa dosya sistemini mi tarıyorsunuz? –

+1

VisualStudio tarafından sağlanan DTE nesnesini arıyorum. –

+0

Bu işe yarayacak gibi görünüyor: https://stackoverflow.com/a/38876595/509584 –

cevap

7

Bir Rehberlik oluşturmak için, hem de DTE bu kullanıcı dostu dünyayı kullanıyorum üretilmesini yönteminin benim uygulamasıdır. Daha iyi bir çözüm bulamadım.

Bıkmadan projeler:

public static ProjectItem FindSolutionItemByName(DTE dte, string name, bool recursive) 
{ 
    ProjectItem projectItem = null; 
    foreach (Project project in dte.Solution.Projects) 
    { 
     projectItem = FindProjectItemInProject(project, name, recursive); 

     if (projectItem != null) 
     { 
      break; 
     } 
    } 
    return projectItem; 
} 

tek projede bulun:

public static ProjectItem FindProjectItemInProject(Project project, string name, bool recursive) 
{ 
    ProjectItem projectItem = null; 

    if (project.Kind != Constants.vsProjectKindSolutionItems) 
    { 
     if (project.ProjectItems != null && project.ProjectItems.Count > 0) 
     { 
      projectItem = DteHelper.FindItemByName(project.ProjectItems, name, recursive); 
     } 
    } 
    else 
    { 
     // if solution folder, one of its ProjectItems might be a real project 
     foreach (ProjectItem item in project.ProjectItems) 
     { 
      Project realProject = item.Object as Project; 

      if (realProject != null) 
      { 
       projectItem = FindProjectItemInProject(realProject, name, recursive); 

       if (projectItem != null) 
       { 
        break; 
       } 
      } 
     } 
    } 

    return projectItem; 
} 

Daha snippet'leriyle kullanıyorum kodu olarak, here bulunamadı Temelde bu kullanıyorum yöntemlerdir Yeni projeler için rehberlik. Kaynak kodunu arayın ve alın ..

+1

bir uyarı olarak bu hiç çözüm klasörleri için dikkate alınmaz. 'dteSolution.Projects', yalnızca üst düzey öğeleri döndürür, çözüm klasörlerinde olmayan projeleri = = ( – Maslow

+4

Bunun eski olduğunu görürsünüz, ancak bu gerçekten de DTEHelper.FindItemByName() 'kodunun (veya referansın) olması gerekir. –

+4

** DteHelper ** özel bir kod değil, Microsoft - yerleşik. Bu tam bir ad olurdu: ** 'Microsoft.Practices.RecipeFramework.Library.DteHelper' ** –