2012-12-07 27 views
6

Tôi đã liệt kê tất cả các dự án trong giải pháp của mình, sử dụng EnvDTE, nhưng tôi đã tìm thấy một lỗi trong mã của mình: Tôi không thể tải các dự án được tải xuống.Tải lại các dự án đã tải xuống trong EnvDTE

Tôi tìm thấy một cách để bỏ qua các dự án bốc dỡ:

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

Bằng cách này, mã của tôi không sụp đổ - nhưng tôi không thể tải các dự án mất tích thông qua mã, vì chúng tồn tại.

Làm cách nào để tải các dự án đã tải lên vào giải pháp?

Tôi đã thử:

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

Và đã nhận lỗi:

System.Runtime.InteropServices.COMException (...): Command "Project.ReloadProject" là không có sẵn.

Vì vậy, tôi đã cố gắng để bằng cách nào đó có được

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

Nhưng trước đó, từ mọi nơi tôi đã tìm kiếm trên NET, tôi phải trước khi chọn dự án trong giải pháp - và cho rằng, tôi cần project.Name (mà Tôi có), và con đường, mà tôi không (mỗi ví dụ tôi đã tìm thấy giả định rằng đường dẫn giải pháp là giống như đường dẫn dự án, đó là rất khó xảy ra trong một tình huống chung chung).

+0

loại (full namespace) Có gì là 'application'? – Kiquenet

+0

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

Trả lời

4

SDK Visual Studio rõ ràng là cách để thực hiện việc này.

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("{")); 
    } 
    } 
} 

có nhất của nó từ http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/60fdd7b4-2247-4c18-b1da-301390edabf3/

+0

** Info.Dump() ** là gì? – Kiquenet

+0

Xuất phát từ LinqPad, nó giống như 'Console.WriteLine' trên steroid. – Maslow

Các vấn đề liên quan