enregistrer un évaluateur d'expression
L'évaluateur (EE) d'expression doit enregistrer une fabrique de classe avec l'environnement et Visual Studio COM windows. L'évaluateur d'expression est implémentée en tant que DLL afin qu'il puisse être injecté dans l' (DE)espace d'adressage du moteur de débogage ou l'espace d'adressage de Visual Studio, selon lesquels l'entité instancie l'évaluateur d'expression.
Évaluateur d'expression du code managé
Le code managé EE est implémenté en tant que bibliothèque de classes, qui est une DLL qui est enregistrée avec l'environnement COM, généralement démarré par un appel au programme de VSIP, regpkg.exe. Le processus effectif d'écrire des clés de Registre pour l'environnement COM est exécuté automatiquement.
Une méthode de classe principale est marquée avec ComRegisterFunctionAttribute, indiquant que la méthode doit être appelée lorsque la DLL est enregistré avec COM. Cette méthode d'inscription, RegisterClasssouvent appelé, exécute la tâche pour stocker la DLL avec Visual Studio. UnregisterClass correspondant (marqué avec ComUnregisterFunctionAttribute), annule les effets d' RegisterClass quand la DLL est désinstallé.
Les mêmes entrées du Registre sont faites comme pour l'évaluateur d'expression écrite en code non managé ; la seule différence est qu'il n'existe aucune fonction d'assistance telle qu' SetEEMetric pour effectuer le travail pour vous. Un exemple de ces alignement/processus d'annulation d'inscription se présente comme suit :
Exemple
Cette fonction montre comment le code managé EE enregistre et s'annule l'enregistrement avec 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);
}
}
}
}
évaluateur d'expression de code non managé
La DLL de l'évaluateur d'expression implémente la fonction d' DllRegisterServer pour s'inscrire dans l'environnement ainsi que Visual Studio COM.
Notes
Le code du Registre de l'exemple de code de MyCEE se trouve dans le fichier dllentry.cpp, qui se trouve à l'installation de VSIP sous EnVSDK \MyCPkgs\MyCEE.
processus de serveur de DLL
En enregistrant l'évaluateur d'expression, le serveur de DLL :
Stocke ses fabriques de classe CLSID récents les conventions normales COM.
Appelle la fonction d'assistance SetEEMetric pour enregistrer avec Visual Studio la métrique de l'évaluateur d'expression affichée dans le tableau suivant. la fonction SetEEMetric et la métrique spécifiée ci-dessous font partie de la bibliothèque de dbgmetric.lib. Pour plus d'informations, consultez Programmes d'assistance du Kit de développement logiciel pour le débogage.
Métriques
Description
metricCLSID
CLSID de la fabrique de classe de l'évaluateur d'expression
metricName
Nom de l'évaluateur d'expression en tant que chaîne affichable
metricLanguage
Le nom du langage que l'évaluateur d'expression est conçue pour évaluer
metricEngine
GUIDs des moteurs (DE) de débogage qui fonctionnent avec la EE
Notes
metricLanguageGUID identifie le langage de nom, mais il s'agit de l'argument d' guidLang à SetEEMetric qui correspond au langage.Lorsque le compilateur génère le fichier d'informations de débogage, il doit écrire guidLang approprié afin que le sache De qui l'évaluateur d'expression à utiliser.Le De demande en général au fournisseur de symbole ce langage GUID, stocké dans le fichier d'informations de débogage.
Registres de Visual Studio en créant des clés sous HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\VisualStudio \X.Y, où X.Y est la version de Visual Studio à enregistrer.
Exemple
Cette fonction indique comment code non managé (C++) EE enregistre et s'annule l'enregistrement avec 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;
}
Voir aussi
Référence
Programmes d'assistance du Kit de développement logiciel pour le débogage