الحصول على قائمة من حل/ملفات Project مقابل إضافة أو DXCore المساعد

StackOverflow https://stackoverflow.com/questions/1434720

سؤال

أنا أحاول أن أكتب في Visual Studio ذلك ، من بين أمور أخرى ، يحتاج إلى تتبع كل ملف في Visual Studio الحل.أنا أعرف ما هي الأحداث لا تحتاج إلى الاشتراك (عندما حل هو فتح ، عندما يتم إضافة/حذف/تحرير في نفس للمشاريع ، إلخ) ، ولكن أنا لا أفهم كيفية الحصول على قائمة من الملفات من أي من ذلك.

أنا ركبت مؤخرا CodeRush و قد لعب مع DXCore الإطار.أنا سعيد جدا مع هذا النهج في الإضافات, ولكن ما زلت لا أرى طريقة واضحة للحصول على قائمة من الملفات في الحل.

لذا وباختصار: كيف عبر Visual Studio SDK أو DXCore, هل يمكنني الحصول على قائمة موثوقة من الملفات في الحل انها المشاريع ؟

هل كانت مفيدة؟

المحلول

هذا هو كل ما هو متاح بسهولة باستخدام DTE في Visual Studio SDK.

يمكنك الحصول على قائمة من المشاريع في محلول باستخدام المشاريع واجهة.

يمكنك الحصول على قائمة من البنود في مشروع باستخدام ProjectItem واجهة.

لمزيد من المعلومات أنصح القراءة على السيطرة على المشاريع والحلول.

نصائح أخرى

شكرا يا ريد ، المقال الذي يرتبط حصلت لي بعيدا بما فيه الكفاية للحصول على دليل على مفهوم مخضخض في بضع دقائق.

حيث أشعر أنه ذات الصلة هنا هو التكرار و العودية الوسائل التي أنا جمعت ProjectItems.أنا فعلت هذا في DXCore لكن نفس الفكرة تنطبق على الخام Visual Studio SDK (DXCore هو فقط يبحث أجمل المجمع على SDK).إن 'الحل', 'المشاريع', 'المشروع' ، 'ProjectItem' الكائنات هناك حق في EnvDTE.

إعداد المشاريع

EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution;
EnvDTE.Projects projects = solution.Projects;

بالتكرار على المشاريع لسحب ProjectItems

var projects = myProjects.GetEnumerator();
while (projects.MoveNext())
{
    var items = ((Project)projects.Current).ProjectItems.GetEnumerator();
    while (items.MoveNext())
    {
        var item = (ProjectItem)items.Current;
        //Recursion to get all ProjectItems
        projectItems.Add(GetFiles(item));
    }
}

وأخيرا ، العودية أقوم به من أجل الحصول على جميع ProjectItems في النشطة الحل

ProjectItem GetFiles(ProjectItem item)
{
    //base case
    if (item.ProjectItems == null)
        return item;

    var items = item.ProjectItems.GetEnumerator();
    while (items.MoveNext())
    {
        var currentItem = (ProjectItem)items.Current;
        projectItems.Add(GetFiles(currentItem));
    }

    return item;
}

انظر EnvDTE :الحصول على جميع المشاريع (على SolutionFolder بيتا)

هذا الحل يعمل بشكل رائع للحصول على جميع المشاريع في الحل ، حتى لو كانت مشاريع في المجلدات الفرعية.

تأكد من قراءة التعليقات أدناه كما يشير أساسيا إصلاح استخدام هذا لانتزاع DTE2 بدلا من رمز الأصلي أو آخر أنها لا تحصل على الصحيح مثيل Visual Studio:

DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;

(قانون تم تحديثها لتشمل فوق إصلاح)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top