Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Von Bedeutung
In Visual Studio 2015 ist diese Methode der Implementierung von Ausdrucksvaluatoren veraltet. Informationen zur Implementierung von CLR-Ausdrucksauswertern finden Sie unter CLR-Ausdrucksauswerter und Beispiel für verwaltete Ausdrucksauswerter.
Der Ausdrucksauswerter (EE) muss sich als Klassenfabrik sowohl bei 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.
Ausdrucksauswerter für verwalteten Code
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 Hauptklasse ist mit ComRegisterFunctionAttributegekennzeichnet, die angibt, dass die Methode aufgerufen werden soll, wenn die DLL bei COM registriert wird. Diese Registrierungsmethode, häufig genannt RegisterClass, übernimmt die Aufgabe, die DLL mit Visual Studio zu registrieren. Eine entsprechende UnregisterClass (gekennzeichnet mit der ComUnregisterFunctionAttribute) macht die Auswirkungen von RegisterClass rückgängig, wenn die DLL deinstalliert wird.
Die gleichen Registrierungseinträge werden wie für einen EE vorgenommen, der in nicht verwaltetem Code geschrieben wurde, der einzige Unterschied besteht darin, dass es keine Hilfsfunktion wie SetEEMetric gibt, um die Arbeit für Sie zu erledigen. Nachfolgend sehen Sie ein Beispiel für den Registrierungs- und Deaktivierungsprozess.
Example
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);
}
}
}
}
Ausdrucksauswerter für nicht verwalteten Code
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 seine Klassenfabrik
CLSIDgemäß den normalen COM-Konventionen.Ruft die Hilfsfunktion
SetEEMetricauf, um mit Visual Studio die in der folgenden Tabelle gezeigten EE-Metriken zu registrieren. Die funktionSetEEMetricund die wie folgt angegebenen Metriken sind Teil der dbgmetric.lib-Bibliothek . Details finden Sie unter SDK-Hilfsprogramme zum Debuggen .Metric Description metricCLSIDCLSIDder EE-KlassenfabrikmetricNameName des EE als anzeigefähige Zeichenfolge metricLanguageDer Name der Sprache, die der EE auswerten soll metricEngineGUIDs der Debugmodule (DE), die mit diesem EE funktionierenHinweis
Die
metricLanguage``GUIDSprache wird dem Namen nach identifiziert, aber es ist dasguidLangArgument vonSetEEMetric, das die Sprache auswählt. Wenn der Compiler die Debuginformationsdatei generiert, sollte er die entsprechendeguidLangschreiben, 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.
Example
Die folgende Funktion zeigt, wie sich ein nicht verwaltetes Code (C++) EE (Expression Evaluator) bei Visual Studio registriert und die Registrierung wieder aufhebt.
/*---------------------------------------------------------
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;
}