2

Ich möchte eine vorhandene .sln-Datei in den Speicher öffnen.Öffnen Sie eine VS 2005-Lösungsdatei (.sln) in den Speicher

Beispiel einer Nicht-Arbeitsweise:

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

Wenn ich eine Instanz von Solution2 habe, dann kann ich die Methode aufrufe, öffnen; aber Wie kann ich eine Instanz von Solution2 bekommen?

Mein Ziel ist es dann, das passende Projekt zu bekommen und einige seiner Einstellungen zu lesen ... aber das ist einfach, Zugang zu der Lösung zu haben.

Vielen Dank im Voraus, Luís

+1

Was ist der Kontext hier? Ist es in Ordnung, die Lösung zu öffnen, oder ist eine bereits geöffnet, die nicht geschlossen werden kann? Wird Ihr Projekt als Visual Studio-Add-In, VSPackage oder als separate Anwendung ausgeführt? –

+0

In einer separaten Anwendung möchte ich eine beliebige VS-Lösung öffnen. @RichieHindle Antwort ist perfekt für meine Situation. Danke –

Antwort

3

Sie können eine versteckte Instanz von Visual Studio programmgesteuert erstellen und sie dann zum Bearbeiten Ihrer Lösung verwenden. In diesem Beispiel werden alle Projekte aufgelistet, die in der angegebenen Lösung enthalten sind.

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 

(Der Unsinn mit STAThread und Message ist „aufgrund Konkurrenzprobleme zwischen externen Anwendungen mit mehreren Threads und Visual Studio zu Threading“, was immer das bedeutet. Einfügen in dem Code von http://msdn.microsoft.com/en-us/library/ms228772.aspx macht es funktionieren.)

+0

Großartig, es funktioniert! –

-1

Solution2 et al sind grundsätzlich Teile von Visual Studio SDK, die Sie mit Ihrer Anwendung zu verteilen haben würden (mit allen Lizenzen Auswirkungen).

Da .sln Dateien sind einfach alte XML, können Sie es immer in XmlDocument öffnen und dann XPath hinein.

+0

Ich möchte wirklich auf die .sln-Datei als Solution2-Instanz zugreifen. Ich möchte dann in der Lage sein, die Methoden zu verwenden, die bereits von Visual Studio Entwicklern –

+5

.sln sind nicht XML. .proj sind XML-Dateien – Jehof

0

Ich habe nicht viel Erfahrung mit diesem, aber versuchen Sie this msdn Artikel. Es ist nicht direkt, was Sie suchen, aber sie instanziieren ein Solution2-Objekt im Beispielcode.

+0

Hej! Danke für deine Antwort, aber leider hilft es mir in dieser speziellen Situation nicht. In dem Beispiel haben sie bereits eine DTE-Instanz und von ihr erhalten sie die Solution-Instanz. Ich habe das Gefühl, dass es einfach unmöglich ist, das zu tun, was ich möchte ... vielleicht gibt es einen Grund dafür, aufgrund einiger VS-Innenwerke –

1

Solution2 ist eine Schnittstelle, keine Klasse. Sie können nicht direkt ein Objekt vom Typ Solution2 erstellen, sondern nur Referenzobjekte als Solution2, die die Solution2-Schnittstelle enthalten.

Soweit ich weiß, sind Klassen, die die Solution2-Schnittstelle implementieren, nur als Teil der Interface-Sammlung in der Visual Studio-Integration verfügbar, also müssen Sie etwas tun, was RichieHindle erwähnt, und ein neues erstellen versteckte Visual Studio-Instanz zum Laden der Lösung.

Wenn Sie nur ein paar Einstellungen aus der SLN-Datei greifen wollen, würde ich empfehlen, es selbst zu analysieren, das Dateiformat ist ziemlich einfach. Wenn Sie versuchen, eine Einstellung herauszuziehen, sind die Chancen der Randfall, in dem das syntaktische Analysieren der sln nicht funktionieren würde, würde auch nicht mit dem funktionieren, was Sie versuchen, wenn Visual Studio die sln für Sie analysiert.