2012-12-07 10 views
6

Wymieniłem wszystkie projekty w moim rozwiązaniu, używając EnvDTE, ale znalazłem błąd w moim kodzie: Nie mogę uzyskać projektów, które są Rozładowane.Ponownie wczytaj niezaładowane projekty w EnvDTE

znalazłem sposób pominąć rozładowane projekty:

if (string.Compare(EnvDTE.Constants.vsProjectKindUnmodeled, project.Kind, System.StringComparison.OrdinalIgnoreCase) == 0) 
    continue; 

ten sposób mój kod nie psuje - ale nie jestem w stanie załadować brakujące projekty za pomocą kodu, ponieważ już istnieje.

Jak mogę załadować nieobciążone projekty do rozwiązania?

Próbowałem:

project.DTE.ExecuteCommand("Project.ReloadProject"); 

I got błąd:

System.Runtime.InteropServices.COMException (...): Polecenie "Project.ReloadProject" nie jest dostępna.

Więc starałem się jakoś dostać

application.DTE.ExecuteCommand("Project.ReloadProject"); 

Zanim jednak, że z każdego miejsca Szukałam w internecie, muszę wstępnie wybrać projekt w roztworze - i za to muszę project.Name (co Mam) i ścieżkę, której nie mam (każdy przykład, który znalazłem zakłada, że ​​ścieżka rozwiązania jest taka sama jak ścieżka projektu, co jest bardzo mało prawdopodobne w ogólnej sytuacji).

+0

Co typu (pełne nazw) jest 'rolnicze wykorzystanie? – Kiquenet

+0

http://msdn.microsoft.com/en-us/library/envdte._dte.application.aspx – Thalia

Odpowiedz

4

Pakiet Visual Studio SDK to najwyraźniej sposób na zrobienie tego.

var dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE"); 
Microsoft.VisualStudio.Shell.Interop.IVsUIHierarchyWindow hierarchy; 
ServiceProvider sp = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte); 
IVsSolution sol = (IVsSolution)sp.GetService(typeof(SVsSolution)); 

foreach (ProjInfo info in GetProjectInfo(sol)) 
{ 
    info.Dump(); 

} 
//from http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/60fdd7b4-2247-4c18-b1da-301390edabf3/ 
static IEnumerable<ProjInfo> GetProjectInfo(IVsSolution sol) 
{ 
    Guid ignored = Guid.Empty; 
    IEnumHierarchies hierEnum; 
    if (ErrorHandler.Failed(sol.GetProjectEnum((int)__VSENUMPROJFLAGS.EPF_ALLPROJECTS, ref ignored, out hierEnum))) 
    { 
    yield break; 
    } 

    IVsHierarchy[] hier = new IVsHierarchy[1]; 
    uint fetched; 
    while ((hierEnum.Next((uint)hier.Length, hier, out fetched) == VSConstants.S_OK) && (fetched == hier.Length)) 
    { 
    int res = (int)VSConstants.S_OK; 

    Guid projGuid; 
    if (ErrorHandler.Failed(res = sol.GetGuidOfProject(hier[0], out projGuid))) 
    { 
     Debug.Fail(String.Format("IVsolution::GetGuidOfProject returned 0x{0:X}.", res)); 
     continue; 
    } 

    string uniqueName; 
    if (ErrorHandler.Failed(res = sol.GetUniqueNameOfProject(hier[0], out uniqueName))) 
    { 
     Debug.Fail(String.Format("IVsolution::GetUniqueNameOfProject returned 0x{0:X}.", res)); 
     continue; 
    } 
    if(System.IO.Path.GetInvalidPathChars().Any (p =>uniqueName.Contains(p))) 
    { 
     uniqueName.Dump("invalid filename found"); 
     yield return new ProjInfo(projGuid,uniqueName); 
    } 
    else { 
     yield return new ProjInfo(projGuid, Path.GetFileName(uniqueName).BeforeOrSelf("{")); 
    } 
    } 
} 

dostaje większość z nich z http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/60fdd7b4-2247-4c18-b1da-301390edabf3/

+0

Co to jest ** Info.Dump() **? – Kiquenet

+0

Pochodzi z LinqPad, to trochę jak 'Console.WriteLine' na sterydy. – Maslow

Powiązane problemy