다음을 통해 공유


식 계산기에 등록

식 계산기 (EE) 자체 Windows COM 환경 및 Visual Studio 모두 한 클래스 팩터리를 등록 해야 합니다. 디버그 엔진 (DE) 주소 공간 또는 따라 EE 엔터티를 인스턴스화하고 해당 Visual Studio 주소 공간에 삽입 될 수 있도록 EE는 DLL로 구현 됩니다.

관리 되는 코드 식 계산기

EE는 VSIP 프로그램에 대 한 호출으로 시작 일반적으로 COM 환경 자체를 등록 하는 dll을 클래스 라이브러리로 구현 된 관리 코드는 regpkg.exe. COM 환경에 대 한 레지스트리 키를 작성 하는 실제 과정은 자동으로 처리 됩니다.

기본 클래스의 메서드 표시 되어 있는 ComRegisterFunctionAttribute, DLL COM에 등록 될 때 호출 될 메서드 임을 나타내는 이 등록 메서드는 종종 호출 RegisterClass, Visual Studio DLL을 등록 하는 작업을 수행 합니다. 해당 하는 UnregisterClass (표시는 ComUnregisterFunctionAttribute), 효과를 취소 합니다. RegisterClass DLL을 제거할.

관리 되지 않는 코드로 작성 하는 EE에 대 한 동일한 레지스트리 항목이 변경 됩니다. 유일한 차이점은 도우미 함수가 같은 것 SetEEMetric 의 작업을 수행 합니다. 이 등록/등록 취소 프로세스의 예는 다음과 같습니다.

예제

이 함수는 EE에서 관리 되는 코드 등록 하 고 자체를 Visual Studio 등록을 취소 하는 방법 보여 줍니다.

namespace EEMC
{
    [GuidAttribute("462D4A3D-B257-4AEE-97CD-5918C7531757")]
    public class EEMCClass : IDebugExpressionEvaluator
    {
        #region Register and unregister.
        private static Guid guidMycLang = new Guid("462D4A3E-B257-4AEE-97CD-5918C7531757");
        private static string languageName = "MyC";
        private static string eeName = "MyC Expression Evaluator";

        private static Guid guidMicrosoftVendor = new Guid("994B45C4-E6E9-11D2-903F-00C04FA302A1");
        private static Guid guidCOMPlusOnlyEng = new Guid("449EC4CC-30D2-4032-9256-EE18EB41B62B");
        private static Guid guidCOMPlusNativeEng = new Guid("92EF0900-2251-11D2-B72E-0000F87572EF");

        /// <summary>
        /// Register the expression evaluator.
        /// Set "project properties/configuration properties/build/register for COM interop" to true.
        /// </summary>
         [ComRegisterFunctionAttribute]
        public static void RegisterClass(Type t)
        {
            // Get Visual Studio version (set by regpkg.exe)
            string hive = Environment.GetEnvironmentVariable("EnvSdk_RegKey");
            string s = @"SOFTWARE\Microsoft\VisualStudio\"
                        + hive
                        + @"\AD7Metrics\ExpressionEvaluator";

            RegistryKey rk = Registry.LocalMachine.CreateSubKey(s);
            if (rk == null)  return;

            rk = rk.CreateSubKey(guidMycLang.ToString("B"));
            rk = rk.CreateSubKey(guidMicrosoftVendor.ToString("B"));
            rk.SetValue("CLSID", t.GUID.ToString("B"));
            rk.SetValue("Language", languageName);
            rk.SetValue("Name", eeName);

            rk = rk.CreateSubKey("Engine");
            rk.SetValue("0", guidCOMPlusOnlyEng.ToString("B"));
            rk.SetValue("1", guidCOMPlusNativeEng.ToString("B"));
        }
        /// <summary>
        /// Unregister the expression evaluator.
        /// </summary>
         [ComUnregisterFunctionAttribute]
        public static void UnregisterClass(Type t)
        {
            // Get Visual Studio version (set by regpkg.exe)
            string hive = Environment.GetEnvironmentVariable("EnvSdk_RegKey");
            string s = @"SOFTWARE\Microsoft\VisualStudio\"
                        + hive
                        + @"\AD7Metrics\ExpressionEvaluator\"
                        + guidMycLang.ToString("B");
            RegistryKey key = Registry.LocalMachine.OpenSubKey(s);
            if (key != null)
            {
                key.Close();
                Registry.LocalMachine.DeleteSubKeyTree(s);
            }
        }
    }
}

관리 되지 않는 코드 식 계산기

EE DLL을 구현에 DllRegisterServer 함수는 COM 환경으로와 Visual Studio 자체를 등록할 수 있습니다.

참고

VSIP 설치 EnVSDK\MyCPkgs\MyCEE 아래에 있는 파일 dllentry.cpp에는 MyCEE 레지스트리 코드 예제를 찾을 수 있습니다.

DLL 서버 프로세스

EE를 DLL 서버를 등록 하는 경우:

  1. 그 클래스 팩토리가 등록 CLSID 일반 COM 규칙에 따라.

  2. 도우미 함수를 호출 SetEEMetric Visual Studio 다음 표에 표시 된 EE 메트릭 등록할 수 있습니다. 함수가 SetEEMetric 및 아래 지정 된 메트릭 dbgmetric.lib 라이브러리의. 자세한 내용은 디버깅에 대 한 SDK 도우미를 참조하십시오.

    메트릭

    설명

    metricCLSID

    CLSIDEE 클래스 팩터리를

    metricName

    표시할 수 있는 문자열로 EE의 이름

    metricLanguage

    EE를 되는 언어의 이름을 평가 하도록 설계

    metricEngine

    GUIDs이이 EE를 사용 하는 디버그 엔진 (DE)의

    참고

    metricLanguageGUID 이름, 하지만 그가 언어를 식별 되는 guidLang 인수를 SetEEMetric 하는 언어를 선택 합니다.컴파일러에서 디버그 정보 파일 생성 하는 경우에 적절 한 작성 해야 guidLang 는 EE를 사용 하는 DE 알 수 있도록 합니다.이 언어에 대해 일반적으로 묻는 기호 공급자는 DE GUID에서 디버그 정보 파일에 저장 합니다.

  3. 키 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\ 아래를 작성 하 여 등록 Visual StudioX.Y, 어디 X.Y 버전이 Visual Studio 등록할 수 있습니다.

예제

이 함수는 비관리 코드 (c + +) EE 등록 하 고 자체와 Visual Studio 등록을 취소 하는 방법 보여 줍니다.

/*---------------------------------------------------------
  Registration
-----------------------------------------------------------*/
#ifndef LREGKEY_VISUALSTUDIOROOT
    #define LREGKEY_VISUALSTUDIOROOT L"Software\\Microsoft\\VisualStudio\\8.0"
#endif

static HRESULT RegisterMetric( bool registerIt )
{
    // check where we should register
    const ULONG cchBuffer = _MAX_PATH;
    WCHAR wszRegistrationRoot[cchBuffer];
    DWORD cchFreeBuffer = cchBuffer - 1;
    wcscpy(wszRegistrationRoot, LREGKEY_VISUALSTUDIOROOT_NOVERSION);
    wcscat(wszRegistrationRoot, L"\\");

    // this is Environment SDK specific
    // we check for  EnvSdk_RegKey environment variable to
    // determine where to register
    DWORD cchDefRegRoot = lstrlenW(LREGKEY_VISUALSTUDIOROOT_NOVERSION) + 1;
    cchFreeBuffer = cchFreeBuffer - cchDefRegRoot;
    DWORD cchEnvVarRead = GetEnvironmentVariableW(
        /* LPCTSTR */ L"EnvSdk_RegKey", // environment variable name
        /* LPTSTR  */ &wszRegistrationRoot[cchDefRegRoot],// buffer for variable value
        /* DWORD   */ cchFreeBuffer);// size of buffer
    if (cchEnvVarRead >= cchFreeBuffer)
        return E_UNEXPECTED;
    // If the environment variable does not exist then we must use 
    // LREGKEY_VISUALSTUDIOROOT which has the version number.
    if (0 == cchEnvVarRead)
        wcscpy(wszRegistrationRoot, LREGKEY_VISUALSTUDIOROOT);

    if (registerIt)
    {
        SetEEMetric(guidMycLang,
                    guidMicrosoftVendor,
                    metricCLSID,
                    CLSID_MycEE,
                    wszRegistrationRoot );
        SetEEMetric(guidMycLang,
                    guidMicrosoftVendor,
                    metricName,
                    GetString(IDS_INFO_MYCDESCRIPTION),
                    wszRegistrationRoot );
        SetEEMetric(guidMycLang,
                    guidMicrosoftVendor,
                    metricLanguage, L"MyC",
                    wszRegistrationRoot);

        GUID engineGuids[2];
        engineGuids[0] = guidCOMPlusOnlyEng;
        engineGuids[1] = guidCOMPlusNativeEng;
        SetEEMetric(guidMycLang,
                    guidMicrosoftVendor,
                    metricEngine,
                    engineGuids,
                    2,
                    wszRegistrationRoot);
    }
    else
    {
        RemoveEEMetric( guidMycLang,
                        guidMicrosoftVendor,
                        metricCLSID,
                        wszRegistrationRoot);
        RemoveEEMetric( guidMycLang,
                        guidMicrosoftVendor,
                        metricName,
                        wszRegistrationRoot );
        RemoveEEMetric( guidMycLang,
                        guidMicrosoftVendor,
                        metricLanguage,
                        wszRegistrationRoot );
        RemoveEEMetric( guidMycLang,
                        guidMicrosoftVendor,
                        metricEngine,
                        wszRegistrationRoot );
    }

    return S_OK;
}

참고 항목

참조

디버깅에 대 한 SDK 도우미

기타 리소스

공용 언어 런타임에서 식 계산기를 작성