我想在内存中打开一个现有的 .sln 文件。
非工作方法示例:
private Solution2 OpenSolution(string filePath)
{
Solution2 sln;
sln.Open(filePath);
return sln;
}
如果我有一个 Solution2 的实例,那么我可以调用方法 Open;但我怎样才能获得 Solution2 的实例?
我的目标是获得足够的项目并阅读它的一些设置......但这很容易获得解决方案。
我想在内存中打开一个现有的 .sln 文件。
非工作方法示例:
private Solution2 OpenSolution(string filePath)
{
Solution2 sln;
sln.Open(filePath);
return sln;
}
如果我有一个 Solution2 的实例,那么我可以调用方法 Open;但我怎样才能获得 Solution2 的实例?
我的目标是获得足够的项目并阅读它的一些设置......但这很容易获得解决方案。
您可以以编程方式创建 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 接口的类只能作为 Visual Studio 集成中接口集合的一部分使用,因此您必须执行类似于 RichieHindle 提到的操作,并创建一个新的隐藏 Visual Studio 实例加载解决方案。
如果您只是想从 sln 文件中获取一些设置,我可能会建议您自己解析它,文件格式非常简单。如果您试图拉出一个设置,那么如果 Visual Studio 为您解析了 sln,那么您自己解析 sln 将无法正常工作的奇怪边缘情况很可能也无法与您尝试执行的操作一起工作。
我对此没有太多经验,但试试这个msdn 文章。它不是您正在寻找的直接内容,但他们确实在示例代码中实例化了一个 solution2 对象。
Solution2
et al 基本上是 Visual Studio SDK 的一部分,您必须与您的应用程序一起重新分发(具有所有许可含义)。
由于.sln
文件是普通的旧 XML,您可以随时打开它,XmlDocument
然后用 XPath 将其打开。