How do I get the current Project Template

10 באוקטובר 2012

אין תגובות

לאחרונה ננתקלתי בבעייה מעניינת, כתבתי AddIn ל – Visual Studio, ונרשמתי לאירוע של הוספת פרוייקט, הקוד עד כאן הוא מאוד פשוט, צריך ליצור פרוייקט מסוג Visual Studio Add In ולעבור את כל ה – Wizard.

לאחר מכן במתודת OnConnection יש לכתוב את הקוד הבא:

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)

{

    _applicationObject = (DTE2)application;

    _addInInstance = (AddIn)addInInst;

 

    SolutionEvents events = _applicationObject.Events.SolutionEvents;

    events.ProjectAdded += SolutionEvents_ProjectAdded;

}

 

void SolutionEvents_ProjectAdded(Project Project)

{

    Debug.WriteLine(Project.FullName);

}

כעת בזמן יצירת פרוייקט, יכתב השם המלא של הפרוייקט לחלון ה – output.

מה שהייתי צריך זה לקבל את סוג הפרוייקט, (Console Application, Windows Service, WPF Appliction וכד’)

לאחר חקירה של כמה ימים (ולילות) התברר שאין שום מידע נורמלי שיאפשר לי לדעת את ה – Template Name של הפרוייקט שנוצר, הכי קרוב היה הפוסט הזה והזה אבל זה לא באמת עזר לי, מכיוון שמוצע שם להשתמש במאפיין בשם ProjectTypeGuids, שלא לכל הפרוייקטים זה קיים, למשל Windows Application, Windows Service נראים אותו דבר מבחינת ProjectType, OutputType.

בשלב הזה הבנתי שאני מחפש בצורה לא נכונה, התחלתי לחשוב הרי יש את ה – Add New Project Dialog שזוכר את סוג הפרוייקט שבחרתי, כלומר הם שומרים היכן שהוא את המידע, אז אמנם לצערי לא נוכל להוציא את המידע מהאובייקט Project, אבל לפחות נוכל לדעת מה סוג הפרוייקט.

התחלתי לחפש, ואז הגעתי ב – Registry למיקום הבא:

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\NewProjectDialog

יש לו SubKey בשם LastUsedTemplateNameProject, ובנוסף גם SubKey בשם MRUSettingsRecentlyUsedTemplates שמכיל את המיקום הפיזי של ה – template.

מסתבר שכדי לקרוא ערכים של ה – Registry עבור Visual Studio לא צריך לעבוד קשה בכלל.

הקוד יראה כך:

void SolutionEvents_ProjectAdded(Project Project)

{

    // Add reference to Microsoft.VisualStudio.Shell.11.0.dll

    // Add reference to Microsoft.VisualStudio.OLE.Interop

 

    var settings = new ShellSettingsManager(ServiceProvider.GlobalProvider);

    var store = settings.GetReadOnlySettingsStore(SettingsScope.UserSettings);

 

    string name = store.GetString("NewProjectDialog", "LastUsedTemplateNameProject");

 

    string path = store.GetString("NewProjectDialog\\MRUSettingsRecentlyUsedTemplates", "Value0");

}

 

כעת נקבל את ה – TemplateName ואת ה – TemplatePath עבור הפרוייקט האחרון שנוצר.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. (*) שדות חובה מסומנים