Откройте файл решения VS 2005 (.sln) в памяти

Я хотел бы открыть в памяти существующий файл.sln.

Пример нерабочего метода:

private Solution2 OpenSolution(string filePath)
{
    Solution2 sln;
    sln.Open(filePath);
    return sln;
}

Если у меня есть экземпляр Solution2, я могу вызвать метод Open; но как я могу получить экземпляр Solution2?

Моя цель состоит в том, чтобы получить адекватный проект и прочитать некоторые его настройки... но это легко, имея доступ к решению.

Заранее спасибо, Луис

4 ответа

Решение

Вы можете программно создать скрытый экземпляр Visual Studio, а затем использовать его для управления своим решением. В этом примере будут перечислены все проекты, которые живут в данном решении.

using System;
using System.Runtime.InteropServices;
using EnvDTE;
using EnvDTE80;

namespace so_sln
{
   class Program
   {
      [STAThread]
      static void Main(string[] args)
      {
         System.Type t = System.Type.GetTypeFromProgID("VisualStudio.DTE.8.0", true);
         DTE2 dte = (EnvDTE80.DTE2)System.Activator.CreateInstance(t, true);

         // See http://msdn.microsoft.com/en-us/library/ms228772.aspx for the
         // code for MessageFilter - just paste it into the so_sln namespace.
         MessageFilter.Register();

         dte.Solution.Open(@"C:\path\to\my.sln");
         foreach (Project project in dte.Solution.Projects)
         {
            Console.WriteLine(project.Name);
         }

         dte.Quit();
      }
   }

   public class MessageFilter : IOleMessageFilter
   {
      ... Continues at http://msdn.microsoft.com/en-us/library/ms228772.aspx

(Бред с STAThread и MessageFilter "из-за проблем с многопоточностью между внешними многопоточными приложениями и Visual Studio", что бы это ни значило. Вставка в код с http://msdn.microsoft.com/en-us/library/ms228772.aspx заставляет его работать.)

Solution2 - это интерфейс, а не класс. Вы не можете напрямую создать объект типа Solution2, только ссылаться на объекты как Solution2, которые содержат интерфейс Solution2.

Насколько мне известно, классы, которые реализуют интерфейс Solution2, доступны только как часть коллекции интерфейсов в интеграции Visual Studio, поэтому вам придется сделать что-то похожее на то, что упоминает RichieHindle, и создать новый скрытый экземпляр Visual Studio. загрузить решение.

Если вы просто хотите получить пару настроек из файла sln, я бы порекомендовал проанализировать их самостоятельно, формат файла довольно прост. Если вы пытаетесь вытащить настройку, скорее всего, это будет странный случай, когда сам анализ sln не будет работать, и не будет работать с тем, что вы пытаетесь сделать, если Visual Studio проанализировала sln для вас.

У меня нет большого опыта с этим, но попробуйте эту статью MSDN. Это не то, что вы ищете, но они создают экземпляр объекта solution2 в примере кода.

Solution2 и др. в основном являются частями Visual Studio SDK, которые вам нужно будет распространять вместе с вашим приложением (со всеми последствиями для лицензирования).

поскольку .sln файлы представляют собой обычный старый XML, вы всегда можете открыть его в XmlDocument а затем XPath в него.

Другие вопросы по тегам