用于列出文件的 Visual Studio 扩展

问题描述 投票:0回答:1

我正在尝试创建一个 VS 扩展来处理解决方案文件。 研究了一些教程并遇到了简单但烦人的问题。

我正在尝试获得解决方案项目,应该用

来完成
var projects = VS.Solutions.GetAllProjectsAsync();

但是 VS 无法弄清楚 VS 对象来自哪个包。 当然,谷歌搜索会提供各种“与对象和结构”等的链接。

有人知道我应该在 using 语句中使用什么吗?

我正在使用 VS2022,安装了 Extensibility Essentials 2022、.NET Framework 4.8

c# vsix vs-extensibility
1个回答
0
投票

我最近为客户编写了一个概念验证扩展,向他们展示如何查找/修改给定解决方案中的所有 .resx。为了好玩,我选择询问 GitHub CoPilot 如何“编写一个返回解决方案中所有 .resx 文件的函数”。它最终生成了一个相当不错的例子:-)

private async void Execute(object sender, EventArgs e)
{
    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

    // enumerate all resources
    var files = await GetResxFilesInSolutionAsync();
    foreach (string filename in files)
    {
        RemoveNodesWithDataType(filename);
    }
}

// Note: The following was generated utilizing GitHub CoPilot and asking the following question.
//
// "write a function that will return all .resx files in a solution"
//

private void GetResxFilesFromProjectItems(ProjectItems items, List<string> resxFiles)
{
    ThreadHelper.ThrowIfNotOnUIThread();
    if (items == null)
        return;

    foreach (ProjectItem item in items)
    {
        if (item.FileCount > 0)
        {
            string filePath = item.FileNames[1];
            if (Path.GetExtension(filePath).Equals(".resx", StringComparison.OrdinalIgnoreCase))
            {
                resxFiles.Add(filePath);
            }
        }

        if (item.SubProject != null)
        {
            GetResxFilesFromProject(item.SubProject, resxFiles);
        }
        else
        {
            GetResxFilesFromProjectItems(item.ProjectItems, resxFiles);
        }
    }
}

private void GetResxFilesFromProject(Project project, List<string> resxFiles)
{
    ThreadHelper.ThrowIfNotOnUIThread();
    if (project.ProjectItems == null)
        return;

    foreach (ProjectItem item in project.ProjectItems)
    {
        if (item.FileCount > 0)
        {
            string filePath = item.FileNames[1];
            if (Path.GetExtension(filePath).Equals(".resx", StringComparison.OrdinalIgnoreCase))
            {
                resxFiles.Add(filePath);
            }
        }

        if (item.SubProject != null)
        {
            GetResxFilesFromProject(item.SubProject, resxFiles);
        }
        else
        {
            GetResxFilesFromProjectItems(item.ProjectItems, resxFiles);
        }
    }
}

private async Task<IEnumerable<string>> GetResxFilesInSolutionAsync()
{
    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
    var dte = (DTE2)await ServiceProvider.GetServiceAsync(typeof(DTE));
    var resxFiles = new List<string>();

    var projects = dte.Solution.Projects;

    foreach (Project project in dte.Solution.Projects)
    {
        GetResxFilesFromProject(project, resxFiles);
    }

    return resxFiles;
}

// Delete all data nodes with a name ending in ".DataType"
private void RemoveNodesWithDataType(string filename)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(filename);

    var dataNodes = doc.SelectNodes("//data");
    foreach (XmlNode node in dataNodes)
    {
        System.Diagnostics.Debug.WriteLine(node.Attributes["name"].Value);
        if (node.Attributes["name"].Value.EndsWith(".DataType"))
        {
            node.ParentNode.RemoveChild(node);
        }
    }
    doc.Save(filename);
}
© www.soinside.com 2019 - 2024. All rights reserved.