@Deka007

Как сделать solution explorer в С#?

Здравствуйте. Как сделать обозреватель решений (solution explorer), примерно как в Visual Studio? Какие классы использовать кроме TreeView? Что читать, где копать?
  • Вопрос задан
  • 252 просмотра
Решения вопроса 2
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Какие нужны классы - зависит от задачи. Чтобы вывести список каталогов и файлов, дополнительные классы не нужны. Код может быть примерно таким:

treeView1.Items.Clear();
GetFiles("C:/Windows/Microsoft.NET", null);

private void GetFiles(string path, TreeViewItem parent)
{
  var node = new TreeViewItem() { Header = System.IO.Path.GetFileName(path) };
      
  if (parent == null)
  {
    treeView1.Items.Add(node);
  }
  else
  {
    parent.Items.Add(node);
  }

  var attr = System.IO.File.GetAttributes(path);

  if (attr.HasFlag(System.IO.FileAttributes.Directory))
  {
    var directories = System.IO.Directory.GetDirectories(path);

    foreach (var dir in directories)
    {
      GetFiles(dir, node);
    }

    var files = System.IO.Directory.GetFiles(path);

    foreach (var file in files)
    {
      node.Items.Add(System.IO.Path.GetFileName(file));
    }
  }
}
Ответ написан
Ogoun
@Ogoun
Programmer
Microsoft.Build
Microsoft.Build.Engine.dll

Для компиляции и работы с проектами советую использовать Microsoft.Build.Framework из nuget, он понимает синтаксис C# 7, у умеет работать с последними версиями .NET.

Таким способом можно читать проекты из решения:
public static void DbgReadSolution(string solution_file)
        {
            var wrapperContent = Microsoft.Build.BuildEngine.SolutionWrapperProject.
                Generate(solution_file, toolsVersionOverride: null, projectBuildEventContext: null);
            byte[] rawWrapperContent = Encoding.Unicode.GetBytes(wrapperContent.ToCharArray());
            using (MemoryStream memStream = new MemoryStream(rawWrapperContent))
            using (XmlTextReader xmlReader = new XmlTextReader(memStream))
            {
                var proj = ProjectCollection.GlobalProjectCollection.LoadProject(xmlReader);
                int i = 0;
                foreach (ProjectItem referencedProjectNode in GetOrderedProjectReferencesFromWrapper(proj))
                {
                    Log.Info(String.Format("{0}{1}: {2}", Environment.NewLine, i++, referencedProjectNode.EvaluatedInclude));
                    string referencedProjectPath = Path.Combine(Path.GetDirectoryName(solution_file), referencedProjectNode.EvaluatedInclude);
                    var referencedProject = ProjectCollection.GlobalProjectCollection.LoadProject(referencedProjectPath);
                    Log.Info("\tReferenced Assemblies:");
                    foreach (ProjectItem referencedAssembly in GetReferencedAssemblies(referencedProject))
                    {
                        Log.Info("\t\t{0}", referencedAssembly.EvaluatedInclude);
                    }
                    Log.Info(String.Format("{0}\tSource Files:", Environment.NewLine));
                    foreach (ProjectItem includedSourceFile in GetSourceFiles(referencedProject))
                    {
                        Log.Info("\t\t{0}", includedSourceFile.EvaluatedInclude);
                    }
                }
                ProjectCollection.GlobalProjectCollection.UnloadAllProjects();
            }
        }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы