Registrace vyhodnocovače výrazů
Důležité
V sadě Visual Studio 2015 je tento způsob implementace vyhodnocovačů výrazů zastaralý. Informace o implementaci vyhodnocovačů výrazů CLR najdete v tématu vyhodnocovače výrazů CLR a ukázka vyhodnocovače spravovaných výrazů.
Vyhodnocovač výrazů (EE) se musí zaregistrovat jako objekt pro vytváření tříd v prostředí Modelu COM systému Windows i v sadě Visual Studio. EE je nastaven jako knihovna DLL, aby byla vložena do adresního prostoru ladicího modulu (DE) nebo adresního prostoru sady Visual Studio v závislosti na tom, která entita vytvoří instanci EE.
Vyhodnocovač výrazů spravovaného kódu
Spravovaný kód EE se implementuje jako knihovna tříd, což je knihovna DLL, která se registruje v prostředí COM, obvykle spuštěna voláním programu VSIP, regpkg.exe. Samotný proces zápisu klíčů registru pro prostředí COM se zpracovává automaticky.
Metoda hlavní třídy je označena ComRegisterFunctionAttribute, označující, že metoda má být volána při registraci knihovny DLL v modelu COM. Tato metoda registrace, často označovaná RegisterClass
, provádí úlohu registrace knihovny DLL v sadě Visual Studio. UnregisterClass
Odpovídající (označená ComUnregisterFunctionAttributepomocí ) vrátí zpět účinky RegisterClass
při odinstalaci knihovny DLL.
Stejné položky registru jsou vyrobeny jako pro EE zapsané v nespravovaném kódu; Jediným rozdílem je, že neexistuje žádná pomocná funkce, jako SetEEMetric
je například práce za vás. Následuje příklad procesu registrace a zrušení registrace.
Příklad
Následující funkce ukazuje, jak se spravovaný kód EE zaregistruje a zruší registraci v sadě 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);
}
}
}
}
Nespravovaný vyhodnocovač výrazů kódu
Knihovna EE DLL implementuje funkci, která se zaregistruje DllRegisterServer
v prostředí MODELU COM i v sadě Visual Studio.
Poznámka:
Vzorový kód MyCEE najdete v souboru dllentry.cpp, který se nachází v instalaci VSIP v části EnVSDK\MyCPkgs\MyCEE.
Proces serveru knihovny DLL
Při registraci EE server knihovny DLL:
Zaregistruje svou továrnu
CLSID
tříd podle běžných konvencí modelu COM.Zavolá pomocnou funkci
SetEEMetric
, která se zaregistruje v sadě Visual Studio, metriky EE zobrazené v následující tabulce. FunkceSetEEMetric
a metriky zadané následujícím způsobem jsou součástí knihovny dbgmetric.lib . Podrobnosti najdete v pomocných rutinách sady SDK pro ladění .Metrický Popis metricCLSID
CLSID
výrobního závodu třídy EEmetricName
Název EE jako zobrazovaný řetězec metricLanguage
Název jazyka, který je navržený k vyhodnocení EE metricEngine
GUID
s ladicího stroje (DE), které pracují s tímto EEPoznámka:
Identifikuje
metricLanguage``GUID
jazyk podle názvu, ale jeguidLang
to argument,SetEEMetric
který jazyk vybere. Když kompilátor vygeneruje informační soubor ladění, měl by zapsat příslušnýguidLang
soubor, aby de věděl, který EE použít. De obvykle žádá poskytovatele symbolů pro tento jazykGUID
, který je uložen v souboru informací o ladění.Zaregistruje se v sadě Visual Studio vytvořením klíčů v části HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\X.Y, kde X.Y je verze sady Visual Studio pro registraci.
Příklad
Následující funkce ukazuje, jak se nespravovaný kód (C++) EE zaregistruje a zruší registraci v sadě 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;
}