在我的代码中,我需要设置一个进程将其连接到某个探查器。我明白这就是我必须要做的事情:
ProcessStartInfo processStartInfo = new ProcessStartInfo(exePath);
processStartInfo.EnvironmentVariables["Cor_Enable_Profiling"] = "0x1";
processStartInfo.EnvironmentVariables["COR_PROFILER"] = "{B146457E-9AED-4624-B1E5-968D274416EC}";
processStartInfo.UseShellExecute = false;
现在的问题是,我不知道,对于我选择的探查器,如何设置processStartInfo.EnvironmentVariables["COR_PROFILER"]
,是否有任何地方可以找到探查器应用程序名称和探查器GUID之间的映射?
答案 0 :(得分:0)
必须将COR_PROFILER环境变量设置为实现ICorProfilerCallback2接口的coclass的GUID。
如果您实现了自定义分析器,则可以在IDL中设置。
这是引用分析器的方法,无需知道实际路径,但为了实现此行为,必须注册具有分析器的COM dll。
答案 1 :(得分:0)
我明白了。
以下是您可以这样做的方法:
public class RunProfiler
{
public void RunProfiler()
{
ProcessStartInfo processStartInfo = new ProcessStartInfo(exePath);
processStartInfo.EnvironmentVariables["Cor_Enable_Profiling"] = "0x1";
processStartInfo.EnvironmentVariables["COR_PROFILER"] = RegistryCode. GetRegistry();
processStartInfo.UseShellExecute = false;
}
}
public static class RegistryCode
{
public static string GetRegistry()
{
RegistryKey objectMe = Registry.ClassesRoot.OpenSubKey("CLSID", false);
string[] valueName = objectMe.GetSubKeyNames();
for (int i = 0; i < valueName.Length; i++)
{
var registryValue= objectMe.OpenSubKey(valueName[i], false).OpenSubKey("InprocServer32", false);
if(registryValue!=null)
{
var valueName1 = (string)registryValue.GetValue("");
if (valueName1!=null&&valueName1.Contains(@"C:\Program Files\Typemock\Isolator\")) // or any other path that your profiler dll is located on
return valueName[i];
}
}
return null;
}
}
答案 2 :(得分:0)
您可以使用COR_PROFILER_PATH而不是COR_PROFILER。它直接指向分析代理DLL。例如:
设置COR_PROFILER_PATH = C:\ program files \ MyProfiler \ MyAgent.dll
请记住,COR_PROFILER_PATH仅适用于CLR4及之后。 另一种选择是使用PROID的GUID。例如:
设置COR_PROFILER = MyProfiler.MyAgent
PROGID在HKEY_CLASSES_ROOT
下注册