2

既存の.slnファイルをメモリに開きます。非加工方法のVS 2005ソリューションファイル(.sln)をメモリに開く

例:私は対処方法2のインスタンスを持っている場合は

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

が、私は、Openメソッドを呼び出すことができます。 Solution2のインスタンスを取得するにはどうすればいいですか

私の目標は、適切なプロジェクトを手に入れ、その設定の一部を読むことです...しかし、それは簡単に解決策にアクセスできます。事前に

おかげで、 ルイス・

+1

ここではどのようなコンテキストですか?解決策を開いても構いませんか、それとも閉じられていないものがありますか?プロジェクトはVisual Studioアドイン、VSPackage、または別のアプリケーションとして実行されていますか? –

+0

別のアプリケーションでは、任意のVSソリューションを開きたいと思っています。 @ RichieHindleの回答は私の状況に最適です。 ありがとう –

答えて

3

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からコード内の貼り付けは、それが動作します。)

+0

素晴らしい、それは動作します! –

-1

Solution2らは、基本的には、あなたが(すべてのライセンス意味合いで)アプリケーションを再配布する必要があると思いますのVisual Studio SDKの一部、です。

.slnは一般的な古いXMLファイルなので、いつでもXmlDocumentで開き、XPathで開くことができます。

+0

本当にSolution2インスタンスとして.slnファイルにアクセスしたいです。私はその後、Visual Studio開発者が既に提供しているメソッドを使用できるようにしたい。 –

+5

.slnはXMLではありません。 .projはXMLファイルです – Jehof

0

私はこれに多くの経験はありませんが、this msdn記事を試してください。探しているものではありませんが、サンプルコードでsolution2オブジェクトをインスタンス化します。

+0

Hej!あなたの答えをありがとうが、残念ながらこの特定の状況で私を助けていません。 例では、それらはすでにDTEインスタンスを持ち、そこからSolutionインスタンスを取得します。 私は、私がしたいと思うことをするのは不可能だと感じています...おそらく、いくつかのVS内部の作品のためにそれに何らかの理由があります –

1

Solution2はインターフェイスであり、クラスではありません。 Solution2型のオブジェクトを直接作成することはできず、Solution2インタフェースを含むSolution2として参照オブジェクトのみを作成することはできません。

Solution2インターフェイスを実装しているクラスはVisual Studio統合のインターフェイスコレクションの一部としてしか利用できないため、RichieHindleの記述に似た何かをしなければならず、新しいVisual Studioインスタンスを非表示にしてソリューションを読み込みます。

slnファイルからいくつかの設定を取得したい場合は、自分で解析することをおすすめします。ファイル形式はかなりシンプルです。あなたが設定を引き出そうとしている場合、自分自身を解析することができないという奇妙なケースがあります。Visual Studioがあなたのためにslnを解析した場合、あなたがしようとしているものではうまくいかないでしょう。

関連する問題