【问题标题】:Open a VS 2005 Solution File (.sln) into memory在内存中打开一个 VS 2005 解决方案文件 (.sln)
【发布时间】:2009-07-23 14:59:52
【问题描述】:

我想在内存中打开一个现有的 .sln 文件。

非工作方法示例:

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

如果我有一个 Solution2 的实例,那么我可以调用方法 Open;但是我怎样才能获得 Solution2 的实例

我的目标是获得足够的项目并阅读它的一些设置......但这很容易获得解决方案。

【问题讨论】:

  • 这里的上下文是什么?是否可以打开解决方案,还是已经打开无法关闭的解决方案?您的项目是作为 Visual Studio 加载项、VSPackage 还是作为单独的应用程序运行?
  • 在一个单独的应用程序中,我想打开任何给定的 VS 解决方案。 @RichieHindle 的答案非常适合我的情况。谢谢

标签: c# visual-studio visual-studio-2005 projects-and-solutions vsx


【解决方案1】:

您可以通过编程方式创建一个隐藏的 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 的代码使其工作。)

【讨论】:

    【解决方案2】:

    Solution2 是一个接口,而不是一个类。您不能直接创建 Solution2 类型的对象,只能将对象引用为包含 Solution2 接口的 Solution2。

    据我所知,实现 Solution2 接口的类只能作为 Visual Studio 集成中接口集合的一部分使用,因此您必须执行类似于 RichieHindle 提到的操作,并创建一个新的隐藏用于加载解决方案的 Visual Studio 实例。

    如果您只是想从 sln 文件中获取一些设置,我可能会建议您自己解析它,文件格式非常简单。如果您试图拉出一个设置,那么如果 Visual Studio 为您解析 sln,那么您自己解析 sln 将无法正常工作的奇怪边缘情况可能也无法与您尝试执行的操作一起工作。

    【讨论】:

      【解决方案3】:

      我对此没有太多经验,但请尝试this msdn 文章。它不是您正在寻找的直接内容,但他们确实在示例代码中实例化了一个 solution2 对象。

      【讨论】:

      • 嘿!感谢您的回答,但不幸的是在这种特殊情况下对我没有帮助。在示例中,他们已经有一个 DTE 实例,并从中获得了解决方案实例。我有一种感觉,就是不可能做我想做的事......也许由于一些 VS 内部工作,这有一些原因
      【解决方案4】:

      Solution2 等基本上是 Visual Studio SDK 的一部分,您必须随应用程序重新分发(包含所有许可影响)。

      由于 .sln 文件是普通的旧 XML,您始终可以在 XmlDocument 中打开它,然后用 XPath 进入它。

      【讨论】:

      • 我真的很想将 .sln 文件作为 Solution2 实例来访问。然后我希望能够使用 Visual Studio 开发人员已经提供的方法
      • .sln 不是 XML。 .proj 是 XML 文件
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      相关资源
      最近更新 更多