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:
Registra il relativo class factory CLSID in base alle convenzioni normali COM.
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.
È 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
Altre risorse
Scrittura dell'analizzatore di espressioni di Common Language Runtime