Freigeben über


Registrieren eines Ausdrucksauswerts

Wichtig

Seit Visual Studio 2015 ist diese Art der Implementierung von Ausdrucksauswertungen veraltet. Informationen zum Implementieren von CLR-Ausdrucksauswertungen finden Sie unter CLR-Ausdrucksauswertungen und Beispiel für die Auswertung verwalteter Ausdrücke.

Der Ausdrucksauswert (EE) muss sich als Klassenfactory sowohl in 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.

Evaluator für verwalteten Codeausdruck

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 Standard-Klasse ist mit ComRegisterFunctionAttributegekennzeichnet, die angibt, dass die Methode aufgerufen werden soll, wenn die DLL bei COM registriert wird. Diese Registrierungsmethode, häufig aufgerufen RegisterClass, führt die Aufgabe aus, die DLL mit Visual Studio zu registrieren. Eine entsprechende UnregisterClass (mit der ComUnregisterFunctionAttribute) gekennzeichnete ) macht die Auswirkungen rückgängig RegisterClass , wenn die DLL deinstalliert wird. Die gleichen Registrierungseinträge werden wie für einen EE vorgenommen, der in nicht verwalteten Code geschrieben wurde; Der einzige Unterschied besteht darin, dass es keine Hilfsfunktion gibt, z SetEEMetric . B. die Arbeit für Sie zu erledigen. Nachfolgend sehen Sie ein Beispiel für den Registrierungs- und Registrierungsprozess.

Beispiel

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

Nicht verwalteter Codeausdruck-Evaluator

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 die Klassenfactory 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 .

    Metrik Beschreibung
    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 anhand des Namens identifiziert, aber es ist das guidLang Argument, 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.

Beispiel

Die folgende Funktion zeigt, wie sich ein nicht verwalteter Code (C++) EE registriert und die Registrierung mit Visual Studio aufgehoben.

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