我正在尝试创建一个 VS 扩展来处理解决方案文件。 研究了一些教程并遇到了简单但烦人的问题。
我正在尝试获得解决方案项目,应该用
来完成var projects = VS.Solutions.GetAllProjectsAsync();
但是 VS 无法弄清楚 VS 对象来自哪个包。 当然,谷歌搜索会提供各种“与对象和结构”等的链接。
有人知道我应该在 using 语句中使用什么吗?
我正在使用 VS2022,安装了 Extensibility Essentials 2022、.NET Framework 4.8
我最近为客户编写了一个概念验证扩展,向他们展示如何查找/修改给定解决方案中的所有 .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);
}