Domanda

Vorrei aprire nella memoria un file .sln esistente.

Esempio di un metodo non-lavoro:

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

Se ho un 'istanza di Solution2 allora posso chiamare il metodo Open; ma come posso ottenere un'istanza di Solution2

Il mio obiettivo è quindi per ottenere il progetto adeguato e leggere alcune delle sue impostazioni ... ma che è facile avere accesso alla soluzione.

Grazie in anticipo, Luís

È stato utile?

Soluzione

È possibile a livello di codice creare un'istanza nascosta di Visual Studio, e poi usarlo per manipolare la vostra soluzione. Questo esempio elencherà tutti i progetti che vivono nella soluzione data.

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

(La sciocchezze con STAThread e MessageFilter è "a causa di problemi di threading contesa tra le applicazioni multi-threaded esterni e Visual Studio", qualunque cosa ciò significhi. Incollare il codice da http://msdn.microsoft.com/en-us/library/ms228772.aspx lo fa funzionare.)

Altri suggerimenti

Solution2 è un'interfaccia, non una classe. Non è possibile effettuare direttamente un oggetto di tipo Solution2, riferimento solo gli oggetti come un Solution2 che contengono l'interfaccia Solution2.

Per quanto ne sono a conoscenza, le classi che implementano l'interfaccia Solution2 sono disponibili solo come parte della collezione di interfaccia per l'integrazione di Visual Studio, in modo da avere a che fare qualcosa di simile a quello che menziona RichieHindle, e creare un nuovo nascosta di visual Studio esempio per caricare la soluzione.

Se sono solo voglia di afferrare un paio di impostazioni di file SLN, avrei potenzialmente consiglio di analisi da soli, il formato del file è piuttosto semplice. Se si sta tentando di tirare un ambiente fuori, è probabile che il caso bordo dispari in cui l'analisi del linfonodo sentinella da soli non funzionerebbe, inoltre, non avrebbe funzionato con quello che si sta cercando di fare se Visual Studio analizzato il linfonodo sentinella per voi.

Non ho molta esperienza con questo, ma cerco questo articolo di MSDN. Non è direttamente ciò che si sta cercando, ma lo fanno un'istanza di un oggetto Solution2 nel codice di esempio.

Solution2 et al sono fondamentalmente le parti del Visual Studio SDK, che avrebbe dovuto ridistribuire con l'applicazione (con tutte le implicazioni delle licenze).

Poiché i file .sln sono Plain Old XML, si può sempre aprire in XmlDocument e poi XPath in esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top