Как я могу получить список файлов в проекте из кода 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);