Как я могу получить список файлов в проекте из кода VSIX(/MPF)?

Я создаю пакет VSIX для поддержки пользовательского языка в Visual Studio с использованием MPF. Я работаю в специальном конструкторе, и мне нужно найти файлы, на которые есть ссылки в проекте, чтобы разрешить некоторые зависимости. Где я могу получить доступ к этому списку?

1 ответ

Решение

Я предполагаю, что вы используете MPF внедрить систему проектов для вашего пользовательского языкового сервиса. При этом у вас, вероятно, есть корневой узел проекта, который является производным от ProjectNode или же HierarchyNode...

Если это так, вы можете поделиться экземпляром корневого узла с дизайнером и попытаться найти файлы, пройдя по иерархии, например...

internal class HierarchyVisitor
{
    private readonly Func<HierarchyNode, bool> filterCallback;

    public HierarchyVisitor(
        Func<HierarchyNode, bool> filter)
    {
        this.filterCallback = filter;
    }

    public IEnumerable<HierarchyNode> Visit(
        HierarchyNode node)
    {
        var stack = new Stack<HierarchyNode>();
        stack.Push(node);
        while (stack.Any())
        {
            HierarchyNode next = stack.Pop();
            if (this.filterCallback(next))
            {
                yield return next;
            }

            for (
                HierarchyNode child = next.FirstChild; 
                child != null; 
                child = child.NextSibling)
            {
                stack.Push(child);
            }
        }
    }
}

Чтобы получить список всех узлов в иерархии, вы можете просто сделать...

ProjectNode root = ...
var visitor = new HierarchyVisitor(x => true);
IEnumerable<HierarchyNode> flatList = visitor.Visit(root);

Или для фильтрации файлов определенного типа, вы можете попробовать что-то вроде этого...

ProjectNode root = ...
var visitor = new HierarchyVisitor((HierarchyNode x) => 
    {
        const string XmlFileExtension = ".xml";
        string path = new Uri(x.Url, UriKind.Absolut).LocalPath;
        return string.Compare(
            XmlFileExtension, 
            Path.GetFileExtension(path), 
            StringComparison.InvariantCultureIgnoreCase) == 0;
    });

IEnumerable<HierarchyNode> xmlFiles = visitor.Visit(root);
Другие вопросы по тегам