2009-08-09 139 views
0

在我的代码中,我需要设置一个进程以将其连接到某个分析器。据我所知,这是我必须做的:如何通过设置COR_PROFILER环境变量链接到正确的分析器

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

我明白了。

这里是你如何能做到这一点:

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; 
     } 


    } 
0

必须将COR_PROFILER环境变量设置为实现ICorProfilerCallback2接口的coclass的GUID。

如果您实施自定义分析器,这将由您在IDL中设置。

这是引用分析器的方式,不需要知道实际的路径,但对于这种行为是可能的,必须注册与分析器的COM DLL。

0

可以使用COR_PROFILER_PATH代替COR_PROFILER。它直接指向分析代理DLL。例如:

集COR_PROFILER_PATH = C:\ Program Files文件\ MyProfiler \ MyAgent.dll

记住COR_PROFILER_PATH只能在CLR4后。 另一种选择是使用GUID insid的PROGID。例如:

组COR_PROFILER = MyProfiler.MyAgent

的ProgID是本HKEY_CLASSES_ROOT下注册