Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Önemli
Visual Studio 2015'te, ifade değerlendiricileri uygulama yöntemi kullanım dışıdır. CLR ifade değerlendiricilerini uygulama hakkında bilgi için bkz. CLR ifade değerlendiricileri ve Yönetilen ifade değerlendirici örneği.
İfade değerlendiricisinin (EE) kendisini hem Windows COM ortamına hem de Visual Studio'ya sınıf fabrikası olarak kaydetmesi gerekir. EE, EE'yi başlatan varlığa bağlı olarak hata ayıklama altyapısı (DE) adres alanına veya Visual Studio adres alanına ekleneceği şekilde DLL olarak ayarlanır.
Yönetilen kod ifadesi değerlendiricisi
Yönetilen bir kod EE, kendisini COM ortamına kaydeden bir DLL olan sınıf kitaplığı olarak uygulanır ve genellikle VSIP programına yapılan bir çağrıyla başlatılır regpkg.exe. COM ortamı için kayıt defteri anahtarlarını yazma işlemi otomatik olarak işlenir.
Ana sınıfın bir yöntemi, DLL'nin COM ile kaydedilmesi sırasında çağrılmak üzere ComRegisterFunctionAttribute olarak işaretlenir. Genellikle olarak adlandırılan RegisterClassbu kayıt yöntemi, DLL'yi Visual Studio'ya kaydetme görevini gerçekleştirir. Buna karşılık gelen UnregisterClass (ComUnregisterFunctionAttribute ile işaretli), DLL'nin kaldırıldığında RegisterClass etkilerini geri alır.
Yönetilmeyen kodla yazılmış bir EE için aynı kayıt defteri girdileri yapılır; tek fark, işi sizin için yapmak gibi SetEEMetric bir yardımcı işlev olmamasıdır. Aşağıda kayıt ve kayıt kaldırma işlemine bir örnek verilmiştir.
Example
Aşağıdaki işlev, yönetilen kod EE'nin Visual Studio'ya nasıl kaydedilip kayıttan çıkarıldığını gösterir.
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);
}
}
}
}
Yönetilmeyen kod ifadesi değerlendiricisi
EE DLL, COM ortamı ve Visual Studio ile kaydolmak için DllRegisterServer işlevini uygular.
Uyarı
EnVSDK\MyCPkgs\MyCEE altındaki VSIP yüklemesinde bulunan dosya dllentry.cpp MyCEE kod örneği kayıt defteri kodunu bulabilirsiniz.
DLL sunucusu işlemi
EE'yi kaydederken, DLL sunucusu:
Sınıf fabrikasını, alışılmış COM kurallarına göre
CLSIDkaydeder.Aşağıdaki tabloda gösterilen EE ölçümlerini Visual Studio'ya kaydetmek için yardımcı işlevini
SetEEMetricçağırır. İşlevSetEEMetricve aşağıda belirtilen ölçümler dbgmetric.lib kitaplığının bir parçasıdır. Ayrıntılar için bkz. Hata ayıklama için SDK yardımcıları .Ölçü birimi Description metricCLSIDCLSIDEE sınıf fabrikasınınmetricNameEE'nin görüntülenebilir dize olarak adı metricLanguageEE'nin değerlendirmek üzere tasarlandığı dilin adı metricEngineGUIDbu EE ile çalışan hata ayıklama motorlarının (DE)Uyarı
metricLanguage``GUIDdili ada göre tanımlar, ancakguidLangbağımsız değişkeniSetEEMetricdil seçimini yapar. Derleyici hata ayıklama bilgileri dosyasını oluşturduğunda, DE'nin hangi EE'nin kullanılacağını bilmesi için uygunguidLangyazması gerekir. DE genellikle hata ayıklama bilgileri dosyasında depolanan bu dilin sembollerini sembol sağlayıcısındanGUIDsorar.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\X.Y altında anahtarlar oluşturarak Visual Studio'ya kaydeder; burada X.Y , kaydedilecek Visual Studio sürümüdür.
Example
Aşağıdaki işlev, yönetilmeyen bir kod (C++) yürütme motorunun kendisini Visual Studio'ya nasıl kaydedip kayıttan kaldırdığını gösterir.
/*---------------------------------------------------------
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;
}