다음을 통해 공유


방법: Interop 어셈블리 가져오기 설정을 사용 하 여

있는 VSPackage 설정을 가져올 수 있는 Visual Studio 통합된 개발 환경 (IDE). IDE Vspackage의 구현을 사용 하 여 IVsUserSettings 인터페이스를 검색할 수 있는 VSPackage 구성 되는 방법을 결정 합니다.

참고

관리 패키지 프레임 워크 (MPF)은 Visual Studio 확장을 만들 수 있도록 관리 되는 클래스 집합을 제공 합니다.MPF를 사용 하 여이 작업을 수행 하기를 참조 하십시오 방법: 패키지 관리 되는 프레임 워크를 사용 하 여 설정 가져오기.

구현할 수 있는 Vspackage에서 설정 가져오기

  1. 에 대 한 기본 지원을 구현에서 Visual Studio 설정 메커니즘입니다.

    • 사용자 지정 설정을 지점을 하나 이상 정의 하 여 설정 메커니즘 지원 파일로 Vspackage를 등록 합니다.

      자세한 내용은 보관 설정를 참조하십시오.

    • 있는 VSPackage 구현 하도록 선언에서 IVsUserSettings 인터페이스, 예를 들어:

      public class MyPackage : IVsPackage, IVsUserSettings, IVsUserSettingsQuery
      
    • Vspackage의 확인 구현은 QueryInterface 메서드 공급 장치는 IVsUserSettings 인터페이스를 호출할 때 IID_IVsUserSettings. 예를 들면 다음과 같습니다.

      STDMETHODIMP MyPackage::QueryInterface(THIS_ REFIID riid, LPVOID FAR* ppvObj)
      {
          if (ppvObj == NULL)
              return E_POINTER;
      
          *ppvObj = NULL;
      
          if (riid == IID_IUnknown)
              *ppvObj = (LPVOID)(IUnknown *)(IClassFactory*)this;
          else if (riid == IID_IClassFactory)
              *ppvObj = (LPVOID)(IClassFactory *)this;
          else if (riid == IID_IVsPackage)
              *ppvObj = (LPVOID)(IVsPackage *)this;
          else if (riid == IID_IVsPersistSolutionOpts)
              *ppvObj = (LPVOID)(IVsPersistSolutionOpts *)this;
          else if (riid == IID_IVsPersistSolutionProps)
              *ppvObj = (LPVOID)(IVsPersistSolutionProps *)this;
          else if (riid == IID_IVsComponentSelectorProvider)
              *ppvObj = (LPVOID)(IVsComponentSelectorProvider *)this;
          else if (riid == IID_IVsUserSettings)
              *ppvObj = (LPVOID)(IVsUserSettings *)this;
          else if (riid == IID_IVsUserSettingsQuery)
              *ppvObj = (LPVOID)(IVsUserSettingsQuery *)this;
      
          if (*ppvObj)
          {
              AddRef();
              return NOERROR;
          }
          return E_NOINTERFACE;
      }
      
  2. 설정 정보를 검색 합니다.

    있는 VSPackage 설정 정보 검색을 지원 하기 위해 구현 해야는 ImportSettings 메서드가 있습니다.

    데이터를 읽을 수 있는 VSPackage 구현을 IVsUserSettings 인터페이스 IDE에서 전달 된 처음 두 개의 인수를 사용 해야 합니다:의 해당 사용자 정의 설정 지점 범주 GUID를 하는 IVsSettingsReader 인터페이스.

    1. Vspackage의 구현에서 ImportSettings 메서드는 전달 된 GUID 항목을 확인 하 고 검색 하는 상태에 대 한 올바른 메커니즘을 선택 합니다.

      아래 예제에는 ImportSettings 키 바인딩 상태를 검색 하는 명령 모음 상태를 검색 하는 데는 서로 다른 구현 메서드를 호출 합니다.

    2. 있는 Vspackage에 제공 된 사용 해야 IVsSettingsReader 설정 파일에 데이터를 검색 하는 인터페이스입니다.

      참고

      설정 정보로 변경 하는 경우는 Visual Studio 버전, Vspackage의 구현에 ImportSettings 메서드를 사용 해야 합니다는 ReadFileVersion 메서드를 IDE 버전을 확인 하려면 데이터 읽기 이전에.

      인터페이스 데이터 형식이 서로 다른 설정 파일을 읽기 위한 메서드를 제공 합니다.

      interface IVsSettingsReader : IUnknown

      {

          HRESULT ReadSettingString(WCHAR *pszSettingName, BSTR *pbstrSettingValue);

          HRESULT ReadSettingLong(WCHAR *pszSettingName, long *plSettingValue);

          HRESULT ReadSettingBoolean(WCHAR *pszSettingName, BOOL *pfSettingValue);

          HRESULT ReadSettingAttribute(LPCOLESTR pszSettingName,LPCOLESTR pszAttributeName, BSTR *pbstrSettingValue); //Internal use only

          HRESULT ReadSettingBytes(WCHAR *pszSettingName, BYTE *pSettingValue, long *plDataLength, long lDataMax);

          HRESULT ReadVersion(int *pnMajor, int *pnMinor, int *pnBuild);

          HRESULT ReportError(WCHAR *pszError);

      };

    설정 파일 순서를 읽기 및 쓰기 작업 설정을 중요 하도록 임의의 데이터 액세스를 지원 합니다.

    이 내보내기를 및 명령 표시줄 상태 가져오기에 나와 (ExportSettings_CommandBar 및 ImportSettings_CommandBar) 아래 예제에서는 구현 합니다.

  3. 검색된 된 데이터의 유효성을 검사 합니다.

    설정 정보를 수동으로 편집할 수 있는 XML 파일에 포함 되어 있습니다.

보안 정보보안 정보

설정 정보는 디스크에 손상 될 수 있습니다, 버전의 설정이 포함 될 수 있습니다 및 악의적인 공격의 수단으로 사용할 수 있습니다.반환 된 각 데이터 항목의 유효성을 IVsSettingsReader 메서드를 확인 합니다.

  • 지원의 버전을 확인 하려면 Visual Studio 검색된 설정을 생성 하는 데 사용, 전화는 ReadFileVersion 버전을 검색 하는 방법.

  • 인해 IDE에서 가져온된 데이터 요소의 유효성을 검사 하지 않은 사용자에 게 알리려면 Vspackage를 호출 하 여 ReportError 메서드.

  1. 설정 정보를 적용 합니다.

    1. 구현에서 ImportSettings 메서드는 IDE 전달 된 세 번째 인수의 값이 존중 합니다. 지원 되는 값의 구성원이 있는 __UserSettingsFlags 열거형입니다. 자세한 내용은 __UserSettingsFlags를 참조하십시오.

      명령 모음 설정 가져오기에 대 한 구현은 아래 예제에서 (ImportSettings_Commandbar)이이 인수 값을 사용 하 여 기존의 값을 덮어쓸 또는 additively 업데이트 적용 여부를 결정 합니다.

    2. 적용할 설정을 가져올 때 동시 쓰기 캐시 방법론을 구현 해야 합니다.

      IDE로 설정이 적용 되는 상태 정보를 레지스트리 나 파일 시스템에 동시에 업데이트 되어야 합니다. 구성의 일관성을 보장 하 고 다중 IDE 시나리오를 지원 합니다.

  2. IDE 설정 가져오기 처리 하는 방법을 알려 줍니다.

    사용 하 여 반환 된 pfRestartRequired 의 인수는 ImportSettings 가져온된 설정을 적용 하는 다시 시작 해야 할 경우 IDE를 알리는 방법입니다.

    경우 Vspackage의 구현에서 ImportSettings 메서드가 반환 true, IDE를 다시 시작 하 라는.

예제

이 예제에서는 설정 데이터 가져오기 및 내보내기 방법을 설명 합니다.

static const WCHAR c_szFirstSettingName[] = L"FirstSettingName";
static const WCHAR c_szRandomTrashBytes[] = L"RandomTrashBytes";
static const WCHAR c_szRandomTrashLength[] = L"RandomTrashLength";
static const WCHAR c_szBreakPointWindow[] = L"Breakpoints Window";
// --------------------------------------------------------------------------
//    IVsUserSettings methods used for configuration export and import
//    Delegate to the right shell object based on the category GUID
// --------------------------------------------------------------------------
static const WCHAR c_szFirstSettingName[] = L"FirstSettingName";
static const WCHAR c_szRandomTrashBytes[] = L"RandomTrashBytes";
static const WCHAR c_szRandomTrashLength[] = L"RandomTrashLength";
static const WCHAR c_szBreakPointWindow[] = L"Breakpoints Window";

// Export Settings.

STDMETHOD(NeedExport)(WCHAR* pszCategoryGUID, BOOL *pfNeedExport)
{
    if (!pfNeedExport)
        return E_INVALIDARG;
    
    CLSID clsidCategory;
    HRESULT hr= S_OK;
    
    hr = CLSIDFromString(pszCategoryGUID, &clsidCategory);
    IfFailGo(hr);
    if (GUID_Profiles_CommandBars == clsidCategory) {
        *pfNeedExport = TRUE; //Always export Command Bar Configuration
    }else if (GUID_Profiles_KeyBindings == clsidCategory) {
        *pfNeedExport = FALSE; //By Default don't export key bindings
        if (m_fMake_Permanent)
            *pfNeedExport = TRUE; //Export if user wants current configuration saved.
    }else{
        hr = E_UNEXPECTED;
    }
 Error:
    return hr;
}

STDMETHOD(ExportSettings)(WCHAR *pszCategoryGUID, IVsSettingsWriter *pSettings)
{
    CLSID clsidCategory;
    HRESULT hr;
    hr = CLSIDFromString(pszCategoryGUID, &clsidCategory);
    IfFailGo(hr);
    // Delegate to the right internal implementation based on the requested category.
    
    if (GUID_Profiles_CommandBars == clsidCategory) {
        hr = ExportSettings_CommandBars(pSettings);
    }else if (GUID_Profiles_KeyBindings == clsidCategory) {
        hr = ExportSettings_KeyBindings(pSettings);
    }else{
        hr = E_UNEXPECTED;
    }
 Error:
    return hr;
};


HRESULT ExportSettings_CommandBars(IVsSettingsWriter *pSettings)
{
    if (!pSettings)
        return E_INVALIDARG;
    
    hr = pSettings->WriteSettingString(c_szFirstSettingName, L"Value1");
    IfFailGo(hr);
    
    int cRandomTrash = 12345;
    BYTE *pRandomTrash = (BYTE *)VSAlloc(cRandomTrash);
    if (pRandomTrash){
        hr = pSettings->WriteSettingBytes(c_szRandomTrashBytes, pRandomTrash, cRandomTrash);
        IfFailGo(hr);
        hr = pSettings->WriteSettingLong(c_szRandomTrashLength, cRandomTrash);
        IfFailGo(hr);
    }
    
 Error:
    return hr;
};

HRESULT ExportSettings_KeyBindings(IVsSettingsWriter *pSettings)
{
    if (!pSettings)
        return E_INVALIDARG;
    
    hr = pSettings->WriteSettingString(c_szBreakPointWindow, L"Ctrl + Alt + B");
    IfFailGo(hr);
    
 Error:
    return hr;
};

STDMETHOD(ImportSettings)(WCHAR *pszCategoryGUID, IVsSettingsReader *pSettings, UserSettingsFlags flags, BOOL *pfRestartRequired)
{
    CLSID clsidCategory;
    HRESULT hr;
    
    hr = CLSIDFromString(pszCategoryGUID, &clsidCategory);
    IfFailGo(hr);
    
    // Delegate to the right internal implementation based on the requested category.
    if (GUID_Profiles_CommandBars == clsidCategory)
        {
            hr = ImportSettings_CommandBars(, pSettings, flags, pfRestartRequired);
        }
    else if (GUID_Profiles_KeyBindings == clsidCategory)
        {
            hr = ImportSettings_KeyBindings( pSettings, flags, pfRestartRequired);
        }
    else
        {
            hr = E_UNEXPECTED;
        }
    
 Error:
    return hr;
};

// Import Settings.

HRESULT ImportSettings_CommandBars(IVsSettingsReader *pSettings, UserSettingsFlags flags, BOOL *pfRestartRequired)
{
    if (!pSettings)
        return E_INVALIDARG;
    
    if (pfRestartRequired)
        {
            *pfRestartRequired = FALSE; //Nobody should require a restart!!
        }
    
    CComBSTR bstrFirstSettingName;
    long lTrashLength = 0;
    BYTE *pTrashBytes = NULL;
    
    // Determines whether to import as an additive operation, or a reset all settings operation.
    BOOL fResetCompletely = FALSE; 
    
    if (flags & USF_ResetOnImport)
        fResetCompletely = TRUE;
    
    hr = pSettings->ReadSettingString(c_szFirstSettingName, &bstrFirstSettingName);
    IfFailGo(hr);
    
    hr = pSettings->ReadSettingLong(c_szRandomTrashLength, &lTrashLength);
    IfFailGo(hr);
    
    if (lTrashLength > 0)
        {
            pTrashBytes = (BYTE*)VSAlloc(lTrashLength);
            IfNullMemGo(pTrashBytes);
            
            long lDataRead = 0;
            
            hr = pSettings->ReadSettingBytes(c_szRandomTrashLength, pTrashBytes, &lDataRead, lTrashLength);
            IfFailGo(hr);
            
            if (lDataRead != lTrashLength)
    {
        hr = E_UNEXPECTED;
        goto Error;
    }
        }
    
    // Note: before returning these settings should immediately be applied to your personal
    //            settings store, whether in the registry or the file system.
    // This write-thru cache methodology is essential to work in multi-instance IDE scenarios.
    hr = UpdateState_CommandBar(bstrFirstSettingName,lTrashLength,pTrashBytes,lDataRead);
    
 Error:
    return hr;
};

HRESULT ImportSettings_KeyBindings(IVsSettingsReader *pSettings, UserSettingsFlags flags, BOOL *pfRestartRequired)
{
    if (!pSettings)
        return E_INVALIDARG;
    
    if (pfRestartRequired)
        {
            *pfRestartRequired = FALSE; //Nobody should require a restart!!
        }
    
    CComBSTR bstrBreakPointWindow;
    
    // Determines whether to import as an additive operation or a reset all settings operation.
    BOOL fResetCompletely = FALSE; 
    
    if (flags & USF_ResetOnImport)
        fResetCompletely = TRUE;
    
    hr = pSettings->ReadSettingString(c_szBreakPointWindow, &bstrBreakPointWindow);
    IfFailGo(hr);
    
    // Note: before returning these settings should immediately be applied to your personal
    //            settings store, whether in the registry or the file system.
    // This write-thru cache methodology is essential to work in multi-instance IDE scenarios.
    hr = UpdateState_KeyBindings(bstrBreakPointWindow);
    
    
 Error:
    return hr;
}

참고 항목

작업

방법: Interop 어셈블리를 사용 하 여 내보내기 설정

개념

보관 설정

기타 리소스

사용자 설정 및 옵션

Working with Settings