방법: DTE 및 DTE2 개체에 대한 참조 가져오기
EnvDTE 어셈블리에서 DTE 개체는 Visual Studio IDE(통합 개발 환경)를 나타내며, 자동화 모델 계층 구조에서 최상위 개체입니다. 핵심 자동화 모델에 액세스하기 위해서는 모든 자동화 응용 프로그램에 이 개체에 대한 참조가 있어야 합니다. 이는 Visual Studio의 경우에도 마찬가지입니다.
그러나 EnvDTE80 어셈블리를 추가하면 DTE 개체를 대체하는 DTE2라는 대체 최상위 개체가 제공됩니다. 이러한 두 개체는 동작이나 프로그래밍하는 방식이 서로 비슷하지만 DTE2가 새로운 기능을 포함하고 있고 새로 추가 또는 업데이트된 여러 개체 및 컬렉션을 호스팅한다는 점이 다릅니다.
따라서 새로운 자동화 응용 프로그램과 추가 기능을 만들 때는 두 개체 모두에 대한 참조를 만들어야 합니다. 새 DTE2 개체는 새로운 기능에 대한 액세스를 제공하는 반면 DTE 개체는 나머지 핵심 자동화 기능에 대한 액세스를 제공합니다. 가능하면 DTE의 개체와 컬렉션 대신 DTE2에 있는 새로운 개체와 컬렉션을 사용하는 것이 좋습니다.
다음 절차에서는 DTE2 개체에 대한 참조를 가져오는 방법을 보여 줍니다. DTE 개체에도 이와 동일한 절차가 적용됩니다. 개체에 대한 참조를 추가하기 전에 해당 어셈블리 및 형식 라이브러리에 대한 참조를 추가해야 합니다. 자세한 내용은 방법: 자동화 네임스페이스에 참조 추가를 참조하십시오.
사용할 프로그래밍 ID(ProgID)는 VisualStudio.DTE.10.0입니다. 이에 맞춰 반환된 개체를 DTE2 인터페이스로 캐스팅할 수 있습니다.
DTE2 속성, 메서드 및 이벤트를 호출하면 DTE 형식이 반환됩니다. 예를 들어, Solution을 호출하면 예상과는 달리 Solution2 개체 대신 Solution 개체가 반환됩니다. 따라서 DTE2 멤버 또는 다른 형식 멤버를 사용하려면 명시적 형식 캐스트를 수행해야 합니다. 이는 몇 가지 목적에서 의도적으로 이루어진 것입니다. 첫째는 일관성을 높이고 혼동을 줄이기 위한 것입니다. EnvDTE80.dll 어셈블리는 모든 DTE2 속성에 대해 일관적으로 동일한 인터페이스를 반환합니다. 그렇지 않고 최신 인터페이스 버전을 반환한다면 혼동이 초래될 것입니다. 예를 들어, Visual Studio의 향후 버전에 DTE3 형식이 도입된다면 인터페이스에 따라 각기 DTE, DTE2 또는 DTE3을 반환하게 될 것입니다. 게다가 EnvDTE80에 있는 "2"가 포함된 인터페이스는 EnvDTE 인터페이스에서 파생되므로 COM interop 문제가 발생합니다. 예를 들어, Window2는 Window에서 파생됩니다. DTE 속성을 Window2에 추가하면 이 속성이 Windows 속성을 숨기게 되고 COM 응용 프로그램에서 올바르게 동작하지 않을 것입니다.
참고
표시되는 대화 상자와 메뉴 명령은 활성 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 이러한 절차는 일반 개발 설정을 사용하여 개발되었습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 설정에 대한 작업을 참조하십시오.
Visual Basic 및 C#에서 DTE2 개체를 참조하려면
코드에 다음과 같은 줄을 추가합니다.
' Get an instance of the currently running Visual Studio IDE. Dim DTE2 as EnvDTE80.DTE2 DTE2 = System.Runtime.InteropServices.Marshal. _ GetActiveObject("VisualStudio.DTE.10.0")
// Get an instance of the currently running Visual Studio IDE. EnvDTE80.DTE2 dte2; dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal. GetActiveObject("VisualStudio.DTE.10.0");
매크로 IDE 개체를 참조하려면 코드에 다음과 같은 줄을 추가합니다.
' Get an instance of the currently running Macros IDE. Dim DTE2 as EnvDTE80.DTE2 Dim MacrosDTE2 as EnvDTE._DTE DTE2 = System.Runtime.InteropServices.Marshal.GetActiveObject_ ("VisualStudio.DTE2") MacrosDTE2 = DTE2.MacrosIDE
// Get an instance of the currently running Macros IDE. EnvDTE80.DTE2 dte2; EnvDTE.DTE MacrosDTE; dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal. GetActiveObject("VisualStudio.DTE.10.0"); MacrosDTE = dte2.MacrosIDE;
Visual C++(ATL)에서 DTE 또는 DTE2 개체를 참조하려면
코드에 다음을 입력합니다.
CComPtr<EnvDTE::_DTE> m_pDTE; CComPtr<EnvDTE80::DTE2> m_pDTE2; CLSID clsid; CLSID clsid2; CLSIDFromProgID(L"VisualStudio.DTE.10.0",&clsid); CLSIDFromProgID(L"VisualStudio.DTE.10.0",&clsid2); CComPtr<IUnknown> punk; CComPtr<IUnknown> punk2; // Get a running instance of Visual Studio. HRESULT hr = GetActiveObject(clsid,NULL,&punk); hr = GetActiveObject(clsid2,NULL,&punk2); m_pDTE = punk; m_pDTE2 = punk2;
매크로 IDE 개체를 참조하려면 코드에 다음과 같은 줄을 추가합니다.
// Get an instance of the currently running Macros IDE. CComPtr<EnvDTE80::DTE2> m_pDTE2; CComPtr<EnvDTE::_DTE> m_pMacrosIDE; CLSID clsid; CLSIDFromProgID(L"VisualStudio.DTE.10.0",&clsid); CComPtr<IUnknown> punk; HRESULT hr = GetActiveObject(clsid,NULL,&punk); m_pDTE = punk; m_pDTE->get_MacrosIDE((void **)&m_pMacrosIDE);