Откройте файл решения 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 в него.