尝试遍历解决方案中的所有文档,但 ProjectItem.ProjectItems 为空
Trying to iterate over all documents in a solution, but ProjectItem.ProjectItems is null
我正在编写一个 Visual Studio 扩展,我想遍历当前解决方案中的所有文件(以查找具有相同名称的忽略扩展的文件)。
环顾四周后,我发现我可以遍历解决方案中的所有项目,并从那里递归遍历所有项目项及其子项。
在一个小的 C# 示例解决方案中,它工作得很好,但如果我在工作中的一个更大的 C++ 解决方案上尝试它,它就不行了。在此解决方案中,所有项目都在解决方案文件夹中排序。 Solution.Projects 包含上述文件夹,每个文件夹的 ProjectItems 属性 包含项目(vcxproj 文件)。但是所有这些项目的 ProjectItems 属性都是空的。不为空,为空。所以递归结束得相当快,没有看到一个实际的文档。
到底是什么?我该怎么办?我怎样才能得到这里的文件?
我已经看过这两个了。接受的答案是我已经拥有的答案:/
Enumerate all files in current visual studio project
Get a list of Solution/Project Files for VS Add-in or DXCore Plugin
我的代码开始递归
DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
foreach (Project project in dte2.Solution.Projects)
{
OpenAll(project.ProjectItems);
}
递归函数
protected void OpenAll(ProjectItems _aItems)
{
Dispatcher.VerifyAccess();
foreach (ProjectItem item in _aItems)
{
if (item.Name != null)
{
string name = item.Name.Contains(".") ? item.Name.Substring(0, item.Name.IndexOf('.')) : item.Name;
if (string.Compare(StrName, name, true) == 0 && !item.IsOpen)
{
// if it's an item with the right name open it
item.Open();
}
}
if (item.ProjectItems != null && item.ProjectItems.Count > 0)
{
// Process sub items
// I NEVER GET HERE BECAUSE ProjectItems IS NULL!
OpenAll(item.ProjectItems);
}
}
}
我发现了问题。文件夹和文件表示为 SolutionItems,但 SulutionItems 中的项目不是 SolutionItems 而是保存在 SubProject
属性 中的项目。因此,要完整遍历解决方案,您需要这样的东西:
// Start the recursion
DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
foreach (Project project in dte2.Solution.Projects)
{
OpenSimilarDocuments(project);
}
递归函数
private void OpenSimilarDocuments(Project _project)
{
Dispatcher.VerifyAccess();
if (_project == null)
{
return;
}
// Traverse all ProjectItems of the project
if (_project.ProjectItems != null)
{
foreach (ProjectItem item in _project.ProjectItems)
{
OpenSimilarDocuments(item);
}
}
}
private void OpenSimilarDocuments(ProjectItem _item)
{
Dispatcher.VerifyAccess();
if (_item == null)
{
return;
}
// See if it is a file we want to open
if (_item.Name != null)
{
string name = _item.Name.Contains(".") ? _item.Name.Substring(0, _item.Name.IndexOf('.')) : _item.Name;
if (string.Compare(StrName, name, true) == 0 && !_item.IsOpen)
{
_item.Open();
}
}
// Traverse all child ProjectItems
if (_item.ProjectItems != null)
{
foreach (ProjectItem item in _item.ProjectItems)
{
OpenSimilarDocuments(item);
}
}
// See if we have a child project and traverse that as well
if (_item.SubProject != null)
{
OpenSimilarDocuments(_item.SubProject);
}
}
仍然让我困惑的是,要查看一个 ProjectItem 是它本身还是包含一个文档,你不能简单地使用 ProjectItem.Document != null
因为有些 ProjectItem 甚至没有这个字段,因此代码会崩溃,但那是别的……<.<
我正在编写一个 Visual Studio 扩展,我想遍历当前解决方案中的所有文件(以查找具有相同名称的忽略扩展的文件)。 环顾四周后,我发现我可以遍历解决方案中的所有项目,并从那里递归遍历所有项目项及其子项。
在一个小的 C# 示例解决方案中,它工作得很好,但如果我在工作中的一个更大的 C++ 解决方案上尝试它,它就不行了。在此解决方案中,所有项目都在解决方案文件夹中排序。 Solution.Projects 包含上述文件夹,每个文件夹的 ProjectItems 属性 包含项目(vcxproj 文件)。但是所有这些项目的 ProjectItems 属性都是空的。不为空,为空。所以递归结束得相当快,没有看到一个实际的文档。
到底是什么?我该怎么办?我怎样才能得到这里的文件?
我已经看过这两个了。接受的答案是我已经拥有的答案:/
Enumerate all files in current visual studio project
Get a list of Solution/Project Files for VS Add-in or DXCore Plugin
我的代码开始递归
DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
foreach (Project project in dte2.Solution.Projects)
{
OpenAll(project.ProjectItems);
}
递归函数
protected void OpenAll(ProjectItems _aItems)
{
Dispatcher.VerifyAccess();
foreach (ProjectItem item in _aItems)
{
if (item.Name != null)
{
string name = item.Name.Contains(".") ? item.Name.Substring(0, item.Name.IndexOf('.')) : item.Name;
if (string.Compare(StrName, name, true) == 0 && !item.IsOpen)
{
// if it's an item with the right name open it
item.Open();
}
}
if (item.ProjectItems != null && item.ProjectItems.Count > 0)
{
// Process sub items
// I NEVER GET HERE BECAUSE ProjectItems IS NULL!
OpenAll(item.ProjectItems);
}
}
}
我发现了问题。文件夹和文件表示为 SolutionItems,但 SulutionItems 中的项目不是 SolutionItems 而是保存在 SubProject
属性 中的项目。因此,要完整遍历解决方案,您需要这样的东西:
// Start the recursion
DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
foreach (Project project in dte2.Solution.Projects)
{
OpenSimilarDocuments(project);
}
递归函数
private void OpenSimilarDocuments(Project _project)
{
Dispatcher.VerifyAccess();
if (_project == null)
{
return;
}
// Traverse all ProjectItems of the project
if (_project.ProjectItems != null)
{
foreach (ProjectItem item in _project.ProjectItems)
{
OpenSimilarDocuments(item);
}
}
}
private void OpenSimilarDocuments(ProjectItem _item)
{
Dispatcher.VerifyAccess();
if (_item == null)
{
return;
}
// See if it is a file we want to open
if (_item.Name != null)
{
string name = _item.Name.Contains(".") ? _item.Name.Substring(0, _item.Name.IndexOf('.')) : _item.Name;
if (string.Compare(StrName, name, true) == 0 && !_item.IsOpen)
{
_item.Open();
}
}
// Traverse all child ProjectItems
if (_item.ProjectItems != null)
{
foreach (ProjectItem item in _item.ProjectItems)
{
OpenSimilarDocuments(item);
}
}
// See if we have a child project and traverse that as well
if (_item.SubProject != null)
{
OpenSimilarDocuments(_item.SubProject);
}
}
仍然让我困惑的是,要查看一个 ProjectItem 是它本身还是包含一个文档,你不能简单地使用 ProjectItem.Document != null
因为有些 ProjectItem 甚至没有这个字段,因此代码会崩溃,但那是别的……<.<