Freigeben über


Registrierung eines Ausdrucksauswerters

Von Bedeutung

In Visual Studio 2015 ist diese Methode der Implementierung von Ausdrucksvaluatoren veraltet. Informationen zur Implementierung von CLR-Ausdrucksauswertern finden Sie unter CLR-Ausdrucksauswerter und Beispiel für verwaltete Ausdrucksauswerter.

Der Ausdrucksauswerter (EE) muss sich als Klassenfabrik sowohl bei der Windows COM-Umgebung als auch in Visual Studio registrieren. Ein EE ist als DLL eingerichtet, sodass er entweder in den Adressraum des Debugmoduls (DE) oder in den Visual Studio-Adressraum eingefügt wird, je nachdem, welche Entität das EE instanziiert.

Ausdrucksauswerter für verwalteten Code

Ein verwalteter Code EE wird als Klassenbibliothek implementiert, bei der es sich um eine DLL handelt, die sich in der COM-Umgebung registriert, in der Regel durch einen Aufruf des VSIP-Programms, regpkg.exe. Der eigentliche Prozess zum Schreiben der Registrierungsschlüssel für die COM-Umgebung wird automatisch behandelt.

Eine Methode der Hauptklasse ist mit ComRegisterFunctionAttributegekennzeichnet, die angibt, dass die Methode aufgerufen werden soll, wenn die DLL bei COM registriert wird. Diese Registrierungsmethode, häufig genannt RegisterClass, übernimmt die Aufgabe, die DLL mit Visual Studio zu registrieren. Eine entsprechende UnregisterClass (gekennzeichnet mit der ComUnregisterFunctionAttribute) macht die Auswirkungen von RegisterClass rückgängig, wenn die DLL deinstalliert wird. Die gleichen Registrierungseinträge werden wie für einen EE vorgenommen, der in nicht verwaltetem Code geschrieben wurde, der einzige Unterschied besteht darin, dass es keine Hilfsfunktion wie SetEEMetric gibt, um die Arbeit für Sie zu erledigen. Nachfolgend sehen Sie ein Beispiel für den Registrierungs- und Deaktivierungsprozess.

Example

Die folgende Funktion zeigt, wie ein verwalteter Code EE sich mit Visual Studio registriert und die Registrierung aufheben kann.

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);
            }
        }
    }
}

Ausdrucksauswerter für nicht verwalteten Code

Die EE-DLL implementiert die DllRegisterServer Funktion, um sich mit der COM-Umgebung und Visual Studio zu registrieren.

Hinweis

Sie finden den MyCEE-Codebeispielregistrierungscode in der Datei dllentry.cpp, die sich in der VSIP-Installation unter EnVSDK\MyCPkgs\MyCEE befindet.

DLL-Serverprozess

Beim Registrieren des EE, der DLL-Server:

  1. Registriert seine Klassenfabrik CLSID gemäß den normalen COM-Konventionen.

  2. Ruft die Hilfsfunktion SetEEMetric auf, um mit Visual Studio die in der folgenden Tabelle gezeigten EE-Metriken zu registrieren. Die funktion SetEEMetric und die wie folgt angegebenen Metriken sind Teil der dbgmetric.lib-Bibliothek . Details finden Sie unter SDK-Hilfsprogramme zum Debuggen .

    Metric Description
    metricCLSID CLSID der EE-Klassenfabrik
    metricName Name des EE als anzeigefähige Zeichenfolge
    metricLanguage Der Name der Sprache, die der EE auswerten soll
    metricEngine GUIDs der Debugmodule (DE), die mit diesem EE funktionieren

    Hinweis

    Die metricLanguage``GUID Sprache wird dem Namen nach identifiziert, aber es ist das guidLang Argument von SetEEMetric, das die Sprache auswählt. Wenn der Compiler die Debuginformationsdatei generiert, sollte er die entsprechende guidLang schreiben, damit der DE weiß, welcher EE verwendet werden soll. Die DE fragt in der Regel den Symbolanbieter für diese Sprache GUID, die in der Debuginformationsdatei gespeichert ist.

  3. Registriert sich bei Visual Studio, indem Schlüssel unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\X.Y erstellt werden, wobei X.Y die Version von Visual Studio ist, bei der sich registrieren soll.

Example

Die folgende Funktion zeigt, wie sich ein nicht verwaltetes Code (C++) EE (Expression Evaluator) bei Visual Studio registriert und die Registrierung wieder aufhebt.

/*---------------------------------------------------------
  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;
}