2012-12-07 22 views
6

में अनलोडेड प्रोजेक्ट दोबारा लोड करें मैंने एनवीडीटीई का उपयोग करके अपने समाधान में सभी परियोजनाओं को सूचीबद्ध किया है, लेकिन मुझे अपने कोड में एक बग मिली है: मुझे अनलोड किए गए प्रोजेक्ट नहीं मिल सकते हैं।एनवीडीटीई

मैं एक तरह से उतार परियोजनाओं को छोड़ पाया:

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

इस तरह, मेरे कोड दुर्घटना नहीं करता है - लेकिन मैं कोड के माध्यम से लापता परियोजनाओं को लोड करने में असमर्थ हूँ, क्योंकि वे पहले से ही मौजूद हैं।

मैं अनलोडेड परियोजनाओं को समाधान में कैसे लोड कर सकता हूं?

मैं कोशिश की है:

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

और त्रुटि मिली:

System.Runtime.InteropServices.COMException (...): कमान "Project.ReloadProject" उपलब्ध नहीं है।

तो मैं किसी भी तरह

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

लेकिन उससे पहले, हर जगह मैं नेट पर खोज की, मैं समाधान में परियोजना पूर्व का चयन करना होगा प्राप्त करने की कोशिश - और उस के लिए, मैं project.Name जरूरत है (जो मेरे पास है), और पथ, जो मैं नहीं करता (मुझे लगता है कि हर उदाहरण को लगता है कि समाधान पथ परियोजना पथ के समान है, जो सामान्य स्थिति में अत्यधिक संभावना नहीं है)।

+0

क्या है प्रकार (पूर्ण नाम स्थान) 'application' है से इसमें से अधिकांश मिल गया? – Kiquenet

+0

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

उत्तर

4

विजुअल स्टूडियो एसडीके स्पष्ट रूप से ऐसा करने का तरीका है।

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

http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/60fdd7b4-2247-4c18-b1da-301390edabf3/

+0

** Info.Dump() ** क्या है? – Kiquenet

+0

लिंककैड से आता है यह स्टेरॉयड पर 'कंसोल। राइटलाइन' की तरह है। – Maslow