Регистрация вычислитель выражений
Средство оценки выражений (EE) должно зарегистрировать как фабрика класса как со средой Visual Studio и модели COM windows. EE реализуется в виде библиотеки DLL таким образом, чтобы он может быть впрыснут в адресное пространство ядра отладки (DE) или адресное пространство Visual Studio, в зависимости от которого создает экземпляр сущности EE.
Средство оценки выражений управляемого кода
Управляемый код EE реализуется в виде библиотеки классов, которая библиотека DLL, которая регистрирует с среда модели COM, обычно инициирована вызовом программы VSIP) regpkg.exe. Фактический процесс написания разделы реестра для среды модели COM обрабатывается автоматически.
Метод основного класса помечен как ComRegisterFunctionAttribute, указывающее, что этот метод вызывается при регистрации DLL с использованием модели COM. Этот метод регистрации, часто Позвонимый RegisterClassвыполняет задачу регистрация библиотеки DLL с помощью Visual Studio. Соответствия UnregisterClass (помеченное ComUnregisterFunctionAttributeотменяет эффект) RegisterClass если библиотека DLL удаляется.
Одни и те же записи реестра выполняются как EE, написанного в неуправляемом коде; единственное отличие заключается в том, что ни одна вспомогательная функция как SetEEMetric работы. Пример этих процесса регистрации и удаления регистрации выглядит следующим образом:
Пример
Эта функция является показано, как управляемый код EE регистрирует и отменяет регистрацию с помощью 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);
}
}
}
}
Средство оценки выражений неуправляемого кода
Библиотека DLL EE реализует DllRegisterServer функция для регистрации со средой Visual Studio и модели COM.
Примечание
Код реестра MyCEE образец кода находится в файле dllentry.cpp, который находится в установке VSIP в EnVSDK \ MyCPkgs \ MyCEE.
Серверный процесс библиотеки DLL
При регистрации EE сервер библиотеки DLL:
Регистрирует его фабрика класса CLSID согласно обычным соглашениям модели COM.
Вызывает вспомогательную функцию SetEEMetric зарегистрировать с помощью Visual Studio метрики EE, показанные в следующей таблице. Функция SetEEMetric и метрики, указанные ниже входит в состав библиотеки dbgmetric.lib. Более подробные сведения см. в разделе: Вспомогательные методы SDK для отладки.
Метрика
Описание
metricCLSID
CLSID фабрики класса EE
metricName
Имя EE как displayable строка
metricLanguage
Имя языка, EE предназначен для оценки
metricEngine
GUIDs обработчиков отладки (DE), работа с этим EE
Примечание
metricLanguageGUID указывает язык по имени, но оно guidLang аргумент SetEEMetric он выбирает язык.Когда компилятор создает информационный файл отладки, она должна написать соответствующие guidLang таким образом, что DE знает, EE для использования.DE обычно запрашивает у поставщика символов этот язык GUID, который хранится в файле отладки.
Регистры с помощью Visual Studio можно создать ключи в разделе HKEY_LOCAL_MACHINE \ software \ microsoft \ VisualStudio \X.Y, где X.Y версия Visual Studio, который необходимо зарегистрировать с помощью.
Пример
Эта функция показано, как неуправляемого кода (C++) EE сам регистрирует и отменяет регистрацию с помощью 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;
}
См. также
Ссылки
Вспомогательные методы SDK для отладки