最近用 c# 写的BHO经常会遇到加载时间过长,导致IE11出现耗时插件禁用对话框,说我的BHO加载时间超过了200ms, 但我怎么优化也没有办法达到其它控件的0.01s,而始终在0.10之上,有时会超过0.20而导致这个问题再次出现。
随后我干脆建了一个空的BHO,发现竟然耗时也在0.10以上,第一次加载有时也会超过0.20s,所以我觉得可能是.net的原因,我用vb6建了一个,虽然有一些代码,但显示加载时间0.01s,下面是我的空BHO的c#代码:
[ComVisible(true), Guid("C59D3771-0E3E-48B8-97C5-9CD2C091CF09"), ClassInterface(ClassInterfaceType.None)] public class BHO : IObjectwithsite { public int SetSite(object site) { return 0; } public int GetSite(ref Guid guid, out IntPtr ppvSite) { IntPtr punk = Marshal.GetIUnknownForObject(IPCServer.WebBrowser); int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite); Marshal.Release(punk); return hr; } #region RegisterBHO public static string BHOKEYNAME = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects"; [ComRegisterFunction] public static void RegisterBHO(Type type) { RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHOKEYNAME, true); if (registryKey == null) registryKey = Registry.LocalMachine.CreateSubKey(BHOKEYNAME); string guid = type.GUID.ToString("B"); RegistryKey ourKey = registryKey.OpenSubKey(guid); if (ourKey == null) ourKey = registryKey.CreateSubKey(guid); registryKey.Close(); ourKey.Close(); } [ComUnregisterFunction] public static void UnregisterBHO(Type type) { RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHOKEYNAME, true); string guid = type.GUID.ToString("B"); if (registryKey != null) registryKey.DeleteSubKey(guid, false); } #endregion }
我试过使用Ngen编译为本地化代码,虽有一点点速度提升,但几乎可以忽略,请问有办法缩短他的加载时间吗?
办法是不使用C#,改用C++,或者等待微软将NET FRAMEWORK在IE中默认加载优化。
c#真不适合干这个, 要干也是vb干, 要不就c++干。