Sdílet prostřednictvím


Registrace vyhodnocovače výrazů

Důležité

V sadě Visual Studio 2015 je tento způsob implementace vyhodnocovačů výrazů zastaralý. Informace o implementaci vyhodnocovačů výrazů CLR najdete v tématu vyhodnocovače výrazů CLR a ukázka vyhodnocovače spravovaných výrazů.

Vyhodnocovač výrazů (EE) se musí zaregistrovat jako objekt pro vytváření tříd v prostředí Modelu COM systému Windows i v sadě Visual Studio. EE je nastaven jako knihovna DLL, aby byla vložena do adresního prostoru ladicího modulu (DE) nebo adresního prostoru sady Visual Studio v závislosti na tom, která entita vytvoří instanci EE.

Vyhodnocovač výrazů spravovaného kódu

Spravovaný kód EE se implementuje jako knihovna tříd, což je knihovna DLL, která se registruje v prostředí COM, obvykle spuštěna voláním programu VSIP, regpkg.exe. Samotný proces zápisu klíčů registru pro prostředí COM se zpracovává automaticky.

Metoda hlavní třídy je označena ComRegisterFunctionAttribute, označující, že metoda má být volána při registraci knihovny DLL v modelu COM. Tato metoda registrace, často označovaná RegisterClass, provádí úlohu registrace knihovny DLL v sadě Visual Studio. UnregisterClass Odpovídající (označená ComUnregisterFunctionAttributepomocí ) vrátí zpět účinky RegisterClass při odinstalaci knihovny DLL. Stejné položky registru jsou vyrobeny jako pro EE zapsané v nespravovaném kódu; Jediným rozdílem je, že neexistuje žádná pomocná funkce, jako SetEEMetric je například práce za vás. Následuje příklad procesu registrace a zrušení registrace.

Příklad

Následující funkce ukazuje, jak se spravovaný kód EE zaregistruje a zruší registraci v sadě 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);
            }
        }
    }
}

Nespravovaný vyhodnocovač výrazů kódu

Knihovna EE DLL implementuje funkci, která se zaregistruje DllRegisterServer v prostředí MODELU COM i v sadě Visual Studio.

Poznámka:

Vzorový kód MyCEE najdete v souboru dllentry.cpp, který se nachází v instalaci VSIP v části EnVSDK\MyCPkgs\MyCEE.

Proces serveru knihovny DLL

Při registraci EE server knihovny DLL:

  1. Zaregistruje svou továrnu CLSID tříd podle běžných konvencí modelu COM.

  2. Zavolá pomocnou funkci SetEEMetric , která se zaregistruje v sadě Visual Studio, metriky EE zobrazené v následující tabulce. Funkce SetEEMetric a metriky zadané následujícím způsobem jsou součástí knihovny dbgmetric.lib . Podrobnosti najdete v pomocných rutinách sady SDK pro ladění .

    Metrický Popis
    metricCLSID CLSID výrobního závodu třídy EE
    metricName Název EE jako zobrazovaný řetězec
    metricLanguage Název jazyka, který je navržený k vyhodnocení EE
    metricEngine GUIDs ladicího stroje (DE), které pracují s tímto EE

    Poznámka:

    Identifikuje metricLanguage``GUID jazyk podle názvu, ale je guidLang to argument, SetEEMetric který jazyk vybere. Když kompilátor vygeneruje informační soubor ladění, měl by zapsat příslušný guidLang soubor, aby de věděl, který EE použít. De obvykle žádá poskytovatele symbolů pro tento jazyk GUID, který je uložen v souboru informací o ladění.

  3. Zaregistruje se v sadě Visual Studio vytvořením klíčů v části HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\X.Y, kde X.Y je verze sady Visual Studio pro registraci.

Příklad

Následující funkce ukazuje, jak se nespravovaný kód (C++) EE zaregistruje a zruší registraci v sadě 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;
}