Registrieren eines Ausdrucksauswertung
Die Ausdrucksauswertung (EE) muss als Klassenfactory mit der Umgebung und Visual Studio der Fenster-COM registrieren. Eine EE wird als DLL implementiert, sodass es in den Debug- Adressbereich des Moduls (DE) oder in Visual Studio-Adressraum eingefügt werden kann, abhängig von dem die Entität EE instanziiert.
Verwalteter Code-Ausdrucksauswerter
Ein verwalteter Code EE wird als Klassenbibliothek, die eine DLL ist, das mit der COM-Umgebung registriert sich in der Regel durch einen Aufruf von VSIP-Programm gestartet, regpkg.exeimplementiert. Der eigentliche Prozess zum Schreiben der Registrierungsschlüssel für die COM-Umgebung wird automatisch behandelt.
Eine Methode der Hauptklasse wird mit ComRegisterFunctionAttributemarkiert. Das bedeutet, dass diese Methode aufgerufen werden soll, wenn die DLL mit COM registriert ist. Diese Registrierungsmethode, häufig aufgerufen RegisterClass, verwendet die Aufgabe des Registrierens der DLL mit Visual Studio aus. Übereinstimmendes UnregisterClass (gekennzeichnet mit ComUnregisterFunctionAttribute), macht die Auswirkungen von RegisterClass , wenn die DLL deinstalliert wird.
Die gleichen Registrierungseinträge werden, z. B. für eine EE, die in nicht verwaltetem Code geschrieben werden soll. Der einzige Unterschied besteht darin, dass keine Hilfsfunktion wie SetEEMetric gibt, um die Arbeit für Sie ausführen. Ein Beispiel für diese Registrierung bzw. Aufheben der Registrierungs-Prozesses sieht wie folgt aus:
Beispiel
Diese Funktion wird gezeigt, wie ein verwalteter Code EE mit Visual Studio registriert und Registrierung aufgehoben werden soll.
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 verwaltete Code-Ausdrucksauswerter
Die EE DLL implementiert die DllRegisterServer-Funktion, um mit der COM-Umgebung sowie - Visual Studio zu registrieren.
Hinweis
Der MyCEE-Codebeispiel-Registrierungs Code kann in der Datei dllentry.cpp gefunden werden, die in der VSIP-Installation unter EnVSDK \ MyCPkgs \ MyCEE ist.
DLL-Server-Prozess
Wenn die EE, der DLL-Server registriert wurde:
Registriert eine Klassenfactory gemäß CLSID normalen COM-Konventionen.
Ruft die Hilfsfunktion SetEEMetric an, die mit Visual Studio die EE-Metrik zu registrieren, die in der folgenden Tabelle gezeigt wird. Die Funktion SetEEMetric und die Metrik, die unten angegeben wird, ist Teil der dbgmetric.lib-Bibliothek. Ausführliche Informationen finden Sie unter SDK-Hilfen für das Debuggen.
Metrik
Beschreibung
metricCLSID
CLSID der EE-Klassenfactorys
metricName
Name der EE als anzeigbare Zeichenfolgen
metricLanguage
Der Name der Sprache, die die EE entworfen wird, um auszuwertende
metricEngine
GUIDder Debugmodule (DE) diese Arbeit mit dieser EE
Hinweis
metricLanguagedie Sprache identifiziertGUID nach Namen. Es ist jedoch das guidLang-Argument an SetEEMetric , das die Sprache ausgewählt wird.Wenn der Compiler die Datei Debuginformationens generiert, sollte er entsprechende guidLang schreiben, sodass die zu verwendende weiß DE EE.DE gefragt wird in der Regel den Hersteller um diese Sprache GUIDSymbol in der Debuginformationens Datei gespeichert wird.
Register mit Visual Studio das Erstellen von Schlüssel unter HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \X.Y, wo X.Y ist mit der Version von Visual Studio zu registrieren.
Beispiel
Diese Funktion wird gezeigt, wie ein nicht verwalteter Code (C++) EE mit Visual Studio registriert und Registrierung aufgehoben werden soll.
/*---------------------------------------------------------
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;
}