2

기존 .sln 파일을 메모리로 열려고합니다. 비 가공 방법의VS 2005 솔루션 파일 (.sln)을 메모리에 엽니 다.

예 : I가 Solution2 인스턴스가있는 경우

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

는 그때 열기 메소드를 호출 할 수있다; 하지만 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 등은 기본적으로 당신이 (모든 라이선스 의미로) 응용 프로그램과 함께 재배포해야 할 것 비주얼 스튜디오 SDK의 일부이다.

.sln 파일은 일반 XML 형식이므로 항상 XmlDocument에서 열고 XPath 형식으로 열 수 있습니다.

+0

.sln 파일에 실제로 Solution2 인스턴스로 액세스하려고합니다. 그런 다음 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 파일에서 몇 가지 설정을 가져오고 싶다면 파일 형식을 간단히 파싱하는 것이 좋습니다. 만약 당신이 밖으로 설정을 시도하고, 가능성은 당신이 비주얼 스튜디오는 당신을 위해 sln을 분석하는 경우 당신이하려고하는 것과 작동하지 않을 sln 자신을 작동하지 않을 파싱은 이상한 경우입니다.