Freigeben über


Registrieren eines Ausdrucksauswertung

Die Ausdrucksauswertung (EE) muss als Klassenfactory mit der Umgebung und Visual Studio der Fenster-COM registrieren. Eine EE wird als DLL implementiert, sodass es in den Debug- Adressbereich des Moduls (DE) oder in Visual Studio-Adressraum eingefügt werden kann, abhängig von dem die Entität EE instanziiert.

Verwalteter Code-Ausdrucksauswerter

Ein verwalteter Code EE wird als Klassenbibliothek, die eine DLL ist, das mit der COM-Umgebung registriert sich in der Regel durch einen Aufruf von VSIP-Programm gestartet, regpkg.exeimplementiert. Der eigentliche Prozess zum Schreiben der Registrierungsschlüssel für die COM-Umgebung wird automatisch behandelt.

Eine Methode der Hauptklasse wird mit ComRegisterFunctionAttributemarkiert. Das bedeutet, dass diese Methode aufgerufen werden soll, wenn die DLL mit COM registriert ist. Diese Registrierungsmethode, häufig aufgerufen RegisterClass, verwendet die Aufgabe des Registrierens der DLL mit Visual Studio aus. Übereinstimmendes UnregisterClass (gekennzeichnet mit ComUnregisterFunctionAttribute), macht die Auswirkungen von RegisterClass , wenn die DLL deinstalliert wird.

Die gleichen Registrierungseinträge werden, z. B. für eine EE, die in nicht verwaltetem Code geschrieben werden soll. Der einzige Unterschied besteht darin, dass keine Hilfsfunktion wie SetEEMetric gibt, um die Arbeit für Sie ausführen. Ein Beispiel für diese Registrierung bzw. Aufheben der Registrierungs-Prozesses sieht wie folgt aus:

Beispiel

Diese Funktion wird gezeigt, wie ein verwalteter Code EE mit Visual Studio registriert und Registrierung aufgehoben werden soll.

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 verwaltete Code-Ausdrucksauswerter

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

Hinweis

Der MyCEE-Codebeispiel-Registrierungs Code kann in der Datei dllentry.cpp gefunden werden, die in der VSIP-Installation unter EnVSDK \ MyCPkgs \ MyCEE ist.

DLL-Server-Prozess

Wenn die EE, der DLL-Server registriert wurde:

  1. Registriert eine Klassenfactory gemäß CLSID normalen COM-Konventionen.

  2. Ruft die Hilfsfunktion SetEEMetric an, die mit Visual Studio die EE-Metrik zu registrieren, die in der folgenden Tabelle gezeigt wird. Die Funktion SetEEMetric und die Metrik, die unten angegeben wird, ist Teil der dbgmetric.lib-Bibliothek. Ausführliche Informationen finden Sie unter SDK-Hilfen für das Debuggen.

    Metrik

    Beschreibung

    metricCLSID

    CLSID der EE-Klassenfactorys

    metricName

    Name der EE als anzeigbare Zeichenfolgen

    metricLanguage

    Der Name der Sprache, die die EE entworfen wird, um auszuwertende

    metricEngine

    GUIDder Debugmodule (DE) diese Arbeit mit dieser EE

    Hinweis

    metricLanguagedie Sprache identifiziertGUID nach Namen. Es ist jedoch das guidLang-Argument an SetEEMetric , das die Sprache ausgewählt wird.Wenn der Compiler die Datei Debuginformationens generiert, sollte er entsprechende guidLang schreiben, sodass die zu verwendende weiß DE EE.DE gefragt wird in der Regel den Hersteller um diese Sprache GUIDSymbol in der Debuginformationens Datei gespeichert wird.

  3. Register mit Visual Studio das Erstellen von Schlüssel unter HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \X.Y, wo X.Y ist mit der Version von Visual Studio zu registrieren.

Beispiel

Diese Funktion wird gezeigt, wie ein nicht verwalteter Code (C++) EE mit Visual Studio registriert und Registrierung aufgehoben werden soll.

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

Siehe auch

Referenz

SDK-Hilfen für das Debuggen

Weitere Ressourcen

Schreiben eines Common Language Runtime-Ausdrucksauswerter