2

既存の.slnファイルをメモリに開きたいのですが。

動作しないメソッドの例:

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

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

私の目標は、適切なプロジェクトを取得し、その設定の一部を読むことです...しかし、それはソリューションにアクセスするのは簡単です。

4

4 に答える 4

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で動作します。)

于 2009-08-12T23:26:55.593 に答える
1

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

私の知る限り、Solution2インターフェイスを実装するクラスは、Visual Studio統合のインターフェイスコレクションの一部としてのみ利用できるため、RichieHindleが言及しているのと同様のことを行い、新しい非表示のVisualStudioインスタンスを作成する必要があります。ソリューションをロードします。

slnファイルからいくつかの設定を取得したいだけの場合は、自分で解析することをお勧めします。ファイル形式は非常に単純です。設定を引き出そうとしている場合、Visual Studioがslnを解析した場合に、slnを自分で解析しても機能せず、実行しようとしていることでも機能しないという奇妙なケースが発生する可能性があります。

于 2009-08-13T08:11:01.350 に答える
0

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

于 2009-08-11T17:04:07.043 に答える
-1

Solution2et alは、基本的にVisual Studio SDKの一部であり、アプリケーションとともに再配布する必要があります(すべてのライセンスの影響があります)。

.slnファイルは単純な古いXMLであるため、いつでもファイルを開いてからXPathで開くことができますXmlDocument

于 2009-07-23T15:09:21.923 に答える