Condividi tramite


registrare un analizzatore di espressioni

L'analizzatore di (EE) espressioni necessario registrarsi come class factory sia con l'ambiente che Visual Studio di windows COM. L'EE viene implementata come DLL in modo che sia possibile inserire nello spazio degli indirizzi (DE) del motore di debug o nello spazio degli indirizzi di Visual Studio, a seconda dell'entità creare un'istanza l'EE.

analizzatore di espressioni di codice gestito

Un codice gestito EE viene implementato come libreria di classi, ovvero una DLL che registra con l'ambiente COM, in genere avviato da una chiamata al programma VSIP, regpkg.exe. Effettivo processo di scrittura delle chiavi del Registro di sistema per l'ambiente COM viene gestito automaticamente.

Un metodo della classe principale è contrassegnato con ComRegisterFunctionAttribute, per indicare che tale metodo deve essere chiamato quando la DLL si sta registrando tramite COM. Questo metodo di registrazione, spesso chiamato RegisterClass, esegue l'attività di registrare la DLL con Visual Studio. UnregisterClass corrispondente (contrassegnato con ComUnregisterFunctionAttribute), annulla gli effetti di RegisterClass quando la DLL viene disinstallato.

Le stesse voci del Registro di sistema vengono eseguite in per l'EE scritto in codice non gestito; l'unica differenza è che non esiste una funzione di supporto come SetEEMetric per le operazioni automaticamente. Un esempio di questi aspetti processo di annullamento/registrazione è analogo al seguente:

Esempio

In questa funzione come un codice gestito EE registra e si annulla la registrazione con 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);
            }
        }
    }
}

analizzatore di espressioni di codice non gestito

La DLL dell'EE implementa la funzione di DllRegisterServer per la registrazione con l'ambiente nonché Visual Studio COM.

Nota

Il codice del Registro di sistema dell'esempio di codice MyCEE è disponibile nel file dllentry.cpp, che si trova nell'installazione di VSIP in EnVSDK \MyCPkgs\MyCEE.

processo server di DLL

Durante la registrazione l'EE, il server di DLL:

  1. Registra il relativo class factory CLSID in base alle convenzioni normali COM.

  2. Chiama la funzione di supporto SetEEMetric per registrare con Visual Studio la metrica dell'EE indicata nella tabella seguente. La funzione SetEEMetric e metriche specificata di seguito fa parte della libreria di dbgmetric.lib. Per informazioni dettagliate, vedere Supporto di SDK per il debug.

    Metrica

    Descrizione

    metricCLSID

    CLSID di class factory dell'EE

    metricName

    nome dell'EE come stringa visualizzabile

    metricLanguage

    Il nome del linguaggio che l'EE è progettata per valutare

    metricEngine

    GUIDs dei (DE) motori di debug che utilizzano la EE

    Nota

    metricLanguageGUID identifica il linguaggio per nome, ma è l'argomento di guidLang a SetEEMetric che seleziona il linguaggio.Quando il compilatore genera il file di informazioni di debug, deve scrivere guidLang appropriato in modo che il DE conosca la quale EE da utilizzare.Il DE in genere richiede il provider del simbolo questo linguaggio GUID, archiviato nel file di informazioni di debug.

  3. È registrato con Visual Studio creare chiavi in HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\VisualStudio \X.Y, dove X.Y è la versione Visual Studio che vengono registrati con.

Esempio

In questa funzione come un codice non gestito (C++) EE registra e si annulla la registrazione con 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;
}

Vedere anche

Riferimenti

Supporto di SDK per il debug

Altre risorse

Scrittura dell'analizzatore di espressioni di Common Language Runtime