Registrieren eines Ausdrucksauswerts
Wichtig
Seit Visual Studio 2015 ist diese Art der Implementierung von Ausdrucksauswertungen veraltet. Informationen zum Implementieren von CLR-Ausdrucksauswertungen finden Sie unter CLR-Ausdrucksauswertungen und Beispiel für die Auswertung verwalteter Ausdrücke.
Der Ausdrucksauswert (EE) muss sich als Klassenfactory sowohl in der Windows COM-Umgebung als auch in Visual Studio registrieren. Ein EE ist als DLL eingerichtet, sodass er entweder in den Adressraum des Debugmoduls (DE) oder in den Visual Studio-Adressraum eingefügt wird, je nachdem, welche Entität das EE instanziiert.
Evaluator für verwalteten Codeausdruck
Ein verwalteter Code EE wird als Klassenbibliothek implementiert, bei der es sich um eine DLL handelt, die sich in der COM-Umgebung registriert, in der Regel durch einen Aufruf des VSIP-Programms regpkg.exe. Der eigentliche Prozess zum Schreiben der Registrierungsschlüssel für die COM-Umgebung wird automatisch behandelt.
Eine Methode der Standard-Klasse ist mit ComRegisterFunctionAttributegekennzeichnet, die angibt, dass die Methode aufgerufen werden soll, wenn die DLL bei COM registriert wird. Diese Registrierungsmethode, häufig aufgerufen RegisterClass
, führt die Aufgabe aus, die DLL mit Visual Studio zu registrieren. Eine entsprechende UnregisterClass
(mit der ComUnregisterFunctionAttribute) gekennzeichnete ) macht die Auswirkungen rückgängig RegisterClass
, wenn die DLL deinstalliert wird.
Die gleichen Registrierungseinträge werden wie für einen EE vorgenommen, der in nicht verwalteten Code geschrieben wurde; Der einzige Unterschied besteht darin, dass es keine Hilfsfunktion gibt, z SetEEMetric
. B. die Arbeit für Sie zu erledigen. Nachfolgend sehen Sie ein Beispiel für den Registrierungs- und Registrierungsprozess.
Beispiel
Die folgende Funktion zeigt, wie ein verwalteter Code EE sich mit Visual Studio registriert und die Registrierung aufheben kann.
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 verwalteter Codeausdruck-Evaluator
Die EE-DLL implementiert die DllRegisterServer
Funktion, um sich mit der COM-Umgebung und Visual Studio zu registrieren.
Hinweis
Sie finden den MyCEE-Codebeispielregistrierungscode in der Datei dllentry.cpp, die sich in der VSIP-Installation unter EnVSDK\MyCPkgs\MyCEE befindet.
DLL-Serverprozess
Beim Registrieren des EE, der DLL-Server:
Registriert die Klassenfactory
CLSID
gemäß den normalen COM-Konventionen.Ruft die Hilfsfunktion
SetEEMetric
auf, um mit Visual Studio die in der folgenden Tabelle gezeigten EE-Metriken zu registrieren. Die funktionSetEEMetric
und die wie folgt angegebenen Metriken sind Teil der dbgmetric.lib-Bibliothek . Details finden Sie unter SDK-Hilfsprogramme zum Debuggen .Metrik Beschreibung metricCLSID
CLSID
der EE-KlassenfabrikmetricName
Name des EE als anzeigefähige Zeichenfolge metricLanguage
Der Name der Sprache, die der EE auswerten soll metricEngine
GUID
s der Debugmodule (DE), die mit diesem EE funktionierenHinweis
Die
metricLanguage``GUID
Sprache wird anhand des Namens identifiziert, aber es ist dasguidLang
Argument,SetEEMetric
das die Sprache auswählt. Wenn der Compiler die Debuginformationsdatei generiert, sollte er die entsprechendeguidLang
Schreiben, damit der DE weiß, welcher EE verwendet werden soll. Die DE fragt in der Regel den Symbolanbieter für diese SpracheGUID
, die in der Debuginformationsdatei gespeichert ist.Registriert sich bei Visual Studio, indem Schlüssel unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\X.Y erstellt werden, wobei X.Y die Version von Visual Studio ist, bei der sich registrieren soll.
Beispiel
Die folgende Funktion zeigt, wie sich ein nicht verwalteter Code (C++) EE registriert und die Registrierung mit Visual Studio aufgehoben.
/*---------------------------------------------------------
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;
}