Поделиться через


Регистрация вычислитель выражений

Средство оценки выражений (EE) должно зарегистрировать как фабрика класса как со средой Visual Studio и модели COM windows. EE реализуется в виде библиотеки DLL таким образом, чтобы он может быть впрыснут в адресное пространство ядра отладки (DE) или адресное пространство Visual Studio, в зависимости от которого создает экземпляр сущности EE.

Средство оценки выражений управляемого кода

Управляемый код EE реализуется в виде библиотеки классов, которая библиотека DLL, которая регистрирует с среда модели COM, обычно инициирована вызовом программы VSIP) regpkg.exe. Фактический процесс написания разделы реестра для среды модели COM обрабатывается автоматически.

Метод основного класса помечен как ComRegisterFunctionAttribute, указывающее, что этот метод вызывается при регистрации DLL с использованием модели COM. Этот метод регистрации, часто Позвонимый RegisterClassвыполняет задачу регистрация библиотеки DLL с помощью Visual Studio. Соответствия 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);
            }
        }
    }
}

Средство оценки выражений неуправляемого кода

Библиотека DLL EE реализует DllRegisterServer функция для регистрации со средой Visual Studio и модели COM.

Примечание

Код реестра MyCEE образец кода находится в файле dllentry.cpp, который находится в установке VSIP в EnVSDK \ MyCPkgs \ MyCEE.

Серверный процесс библиотеки DLL

При регистрации EE сервер библиотеки DLL:

  1. Регистрирует его фабрика класса CLSID согласно обычным соглашениям модели COM.

  2. Вызывает вспомогательную функцию SetEEMetric зарегистрировать с помощью Visual Studio метрики EE, показанные в следующей таблице. Функция SetEEMetric и метрики, указанные ниже входит в состав библиотеки dbgmetric.lib. Более подробные сведения см. в разделе: Вспомогательные методы SDK для отладки.

    Метрика

    Описание

    metricCLSID

    CLSID фабрики класса EE

    metricName

    Имя EE как displayable строка

    metricLanguage

    Имя языка, EE предназначен для оценки

    metricEngine

    GUIDs обработчиков отладки (DE), работа с этим EE

    Примечание

    metricLanguageGUID указывает язык по имени, но оно guidLang аргумент SetEEMetric он выбирает язык.Когда компилятор создает информационный файл отладки, она должна написать соответствующие guidLang таким образом, что DE знает, EE для использования.DE обычно запрашивает у поставщика символов этот язык GUID, который хранится в файле отладки.

  3. Регистры с помощью Visual Studio можно создать ключи в разделе HKEY_LOCAL_MACHINE \ software \ microsoft \ VisualStudio \X.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 для отладки

Другие ресурсы

Запись вычислителя выражений среды CLR