2015-12-07 36 views
0

嘗試使用IActiveScriptProfilerControl::StartProfiling從我的C#代碼,我已經創造了這個接口定義:要作爲IActiveScriptProfilerControl.StartProfiling的第一個參數傳遞什麼?

[ComImport] 
[Guid(@"784b5ff0-69b0-47d1-a7dc-2518f4230e90")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
internal interface IActiveScriptProfilerControl 
{ 
    void StartProfiling(
     ref Guid clsidProfilerObject, 
     ProfilerEventMask eventMask, 
     uint dwContext); 

    // ... 
} 

我相信這是正確地轉換爲.NET。

原來的第一個參數定義爲

[in] REFCLSID clsidProfilerObject 

有了這些定義:

typedef GUID CLSID; 
typedef CLSID *REFCLSID; 

我也是能夠創造微軟JQueryScriptEngine對象和查詢的一個實例爲IActiveScriptProfilerControl

我目前失敗的是如何告訴StartProfiling函數使用我的IActiveScriptProfilerCallback衍生對象。

我的問題:

如何我自己分析器回調類與活動腳本分析器控制界面,通過以IActiveScriptProfilerControl::StartProfiling呼叫連接?

理想情況下,我很願意做到這一點沒有需要我的班級RegAsm

更新1:

我已經改變了接口定義的第一個參數:

[ComImport] 
[Guid(@"784b5ff0-69b0-47d1-a7dc-2518f4230e90")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
internal interface IActiveScriptProfilerControl 
{ 
    void StartProfiling(
     IActiveScriptProfilerCallback clsidProfilerObject, // <-- changed. 
     ProfilerEventMask eventMask, 
     uint dwContext); 

    // ... 
} 

,並試圖通過傳遞我IActiveScriptProfilerCallback派生類的一個實例來調用這個函數。

不過,我得到的錯誤:

Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

+1

我沒有親身經歷,但根據[這](https://msdn.microsoft.com/en-us/library/cc843609 (v = vs.94).aspx)你不能在沒有註冊的情況下創建/調用分析器。 –

+0

@ 500-InternalServerError太棒了!經過快速測試,這似乎工作。我現在試圖看看如何做到這一點,而無需在我的DLL上調用RegAsm。 –

回答

0

(更新從我這來這裏未來的自己,同時尋找類似的錯誤)

我已經成功通過監控註冊表來解決這個問題。

這些鍵都必須爲HKEY_CLASSES_ROOT

REGEDIT4

[HKEY_CLASSES_ROOT\ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback] @="ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback"

[HKEY_CLASSES_ROOT\ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback\CLSID] @="{1C406FBA-59EF-4FB2-938C-C1DA182D5914}"

[HKEY_CLASSES_ROOT\CLSID{1C406FBA-59EF-4FB2-938C-C1DA182D5914}] @="ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback"

[HKEY_CLASSES_ROOT\CLSID{1C406FBA-59EF-4FB2-938C-C1DA182D5914}\InprocServer32] @="mscoree.dll" "ThreadingModel"="Both" "Class"="ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback" "Assembly"="ZetaProducer.SuperSlimScriptingEngineProfiler, Version=14.1.0.0, Culture=neutral, PublicKeyToken=null" "RuntimeVersion"="v4.0.30319" "CodeBase"="file:///C:/P/Zeta Producer/13/Zeta Producer Main/Bin/Applications/ZetaProducer.SuperSlimScriptingEngineProfiler.dll"

[HKEY_CLASSES_ROOT\CLSID{1C406FBA-59EF-4FB2-938C-C1DA182D5914}\InprocServer32\14.1.0.0] "Class"="ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback" "Assembly"="ZetaProducer.SuperSlimScriptingEngineProfiler, Version=14.1.0.0, Culture=neutral, PublicKeyToken=null" "RuntimeVersion"="v4.0.30319" "CodeBase"="file:///C:/P/Zeta Producer/13/Zeta Producer Main/Bin/Applications/ZetaProducer.SuperSlimScriptingEngineProfiler.dll"

[HKEY_CLASSES_ROOT\CLSID{1C406FBA-59EF-4FB2-938C-C1DA182D5914}\ProgId] @="ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback"

[HKEY_CLASSES_ROOT\CLSID{1C406FBA-59EF-4FB2-938C-C1DA182D5914}\Implemented Categories{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

因爲我想我的程序沒有管理員權限運行,我已經創建一個類來創建上述鍵的Unter HKEY_CURRENT_USER,至極也適用。

以下是供參考的滿級文件:

namespace ZetaProducer.SuperSlimScriptingEngineProfiler.Helper 
{ 
    using Microsoft.Win32; 
    using System; 
    using System.Collections.Generic; 
    using System.IO; 
    using System.Reflection; 
    using System.Security.AccessControl; 
    using System.Security.Principal; 
    using Zeta.VoyagerLibrary.Common.IO; 

    public static class ProfilerComRegistration 
    { 
     public static readonly Guid Clsid = new Guid(@"1c406fba-59ef-4fb2-938c-c1da182d5914"); 

     public static void Register() 
     { 
      var key = checkCreateKey(
        @"Software\Classes\ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback"); 
      if (key != null) 
      { 
       key.SetValue(null, @"ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback", RegistryValueKind.String); 
       key.Close(); 
      } 

      key = checkCreateKey(
        @"Software\Classes\ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback\CLSID"); 
      if (key != null) 
      { 
       key.SetValue(null, @"{1C406FBA-59EF-4FB2-938C-C1DA182D5914}", RegistryValueKind.String); 
       key.Close(); 
      } 

      key = checkCreateKey(
        @"Software\Classes\CLSID\{1C406FBA-59EF-4FB2-938C-C1DA182D5914}"); 
      if (key != null) 
      { 
       key.SetValue(null, @"ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback", RegistryValueKind.String); 
       key.Close(); 
      } 

      key = checkCreateKey(
        @"Software\Classes\CLSID\{1C406FBA-59EF-4FB2-938C-C1DA182D5914}\InprocServer32"); 
      if (key != null) 
      { 
       key.SetValue(null, @"mscoree.dll", RegistryValueKind.String); 
       key.SetValue(@"ThreadingModel", @"Both", RegistryValueKind.String); 
       key.SetValue(@"Class", @"ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback", RegistryValueKind.String); 
       key.SetValue(@"Assembly", @"ZetaProducer.SuperSlimScriptingEngineProfiler, Version=14.1.0.0, Culture=neutral, PublicKeyToken=null", RegistryValueKind.String); 
       key.SetValue(@"RuntimeVersion", @"v4.0.30319", RegistryValueKind.String); 
       key.SetValue(@"CodeBase", getFileUrl(), RegistryValueKind.String); 
       key.Close(); 
      } 

      key = checkCreateKey(
        @"Software\Classes\CLSID\{1C406FBA-59EF-4FB2-938C-C1DA182D5914}\InprocServer32\14.1.0.0"); 
      if (key != null) 
      { 
       key.SetValue(@"Class", @"ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback", RegistryValueKind.String); 
       key.SetValue(@"Assembly", @"ZetaProducer.SuperSlimScriptingEngineProfiler, Version=14.1.0.0, Culture=neutral, PublicKeyToken=null", RegistryValueKind.String); 
       key.SetValue(@"RuntimeVersion", @"v4.0.30319", RegistryValueKind.String); 
       key.SetValue(@"CodeBase", getFileUrl(), RegistryValueKind.String); 
       key.Close(); 
      } 

      key = checkCreateKey(
        @"Software\Classes\CLSID\{1C406FBA-59EF-4FB2-938C-C1DA182D5914}\ProgId"); 
      if (key != null) 
      { 
       key.SetValue(null, @"ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback", RegistryValueKind.String); 
       key.Close(); 
      } 
     } 

     private static string getFileUrl() 
     { 
      // ReSharper disable once AssignNullToNotNullAttribute 
      var filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), 
       @"ZetaProducer.SuperSlimScriptingEngineProfiler.dll"); 
      return PathHelper.ConvertFilePathToFileUrl(filePath); 
     } 

     public static void Unregister() 
     { 
      var key = Registry.CurrentUser.OpenSubKey(@"Software\Classes", true); 

      if (key != null && 
       new List<string>(key.GetSubKeyNames()).Contains(
        @"ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback")) 
      { 
       try 
       { 
        key.DeleteSubKeyTree(
         @"ZetaProducer.SuperSlimScriptingEngineProfiler.SlimScriptEngineProfilerCallback", false); 
       } 
       catch (AccessViolationException) 
       { 
       } 
       key.Close(); 
      } 

      key = Registry.CurrentUser.OpenSubKey(@"Software\Classes\CLSID", true); 

      if (key != null && 
       new List<string>(key.GetSubKeyNames()).Contains(@"{1C406FBA-59EF-4FB2-938C-C1DA182D5914}")) 
      { 
       try 
       { 
        key.DeleteSubKeyTree(@"{1C406FBA-59EF-4FB2-938C-C1DA182D5914}", false); 
       } 
       catch (AccessViolationException) 
       { 
       } 
       key.Close(); 
      } 
     } 

     private static RegistryKey checkCreateKey(string keyPath) 
     { 
      var rs = new RegistrySecurity(); 

      // Jeder. 
      var user = new SecurityIdentifier(WellKnownSidType.WorldSid, null); 

      rs.AddAccessRule(
       new RegistryAccessRule(
        user, 
        RegistryRights.FullControl, 
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
        PropagationFlags.None, 
        AccessControlType.Allow)); 

      var key = Registry.CurrentUser.CreateSubKey(keyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, rs); 
      return key; 
     } 
    } 
} 
相關問題