如何从VSIX(/ MPF)代码获取项目中的文件列表?

时间:2015-03-12 20:21:15

标签: visual-studio-extensions vsix vspackage mpf

我正在构建一个VSIX包,以便在Visual Studio中使用MPF支持自定义语言。我在一个自定义设计器中,我需要找到项目中引用的文件来解决一些依赖项。我在哪里可以访问此列表?

1 个答案:

答案 0 :(得分:1)

我认为您使用MPF为自定义语言服务实现项目系统。这样做时,您可能有一个项目根节点,该节点源自ProjectNodeHierarchyNode ......

如果是这样,您可以与设计器共享根节点的实例,并尝试通过遍历层次结构来查找文件,例如......

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);