问题情境:
html界面用浏览器直接打开正常,使用c#自带webbrowser打开报错(具体是js脚本相关错误)
疑难辨析:
对症下药,报错内容虽是js脚本错误,但应该知道js,html相关代码都准确无误,因为在浏览器打开正常。
考虑到webbrowser内核版本和系统自带ie浏览器版本有差别,所以问题很可能在这里。
解决方案:
最好修改webbrowser默认浏览器内核版本,暂未找到。可以先修改自己程序对应的浏览器内核版本。
通过注册表进行修改,修改位置一定要找到,现有两个位置提供参考。
HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER)
SOFTWARE
Microsoft
Internet Explorer
Main
FeatureControl
FEATURE_BROWSER_EMULATION
和
HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER)
SOFTWARE
Wow6432Node
Microsoft
Internet Explorer
Main
FeatureControl
FEATURE_BROWSER_EMULATION
这两个位置区别,自己查找。
在此位置添加值DWORD(32位),仿照该位置下其他值填写,名字为exe名,值为十进制(最新11001)。
细节注意:
1.解决方案debug最好改为release
2.如果不够明确上述两个位置,最好都进行填写。
3.填写成功之后,最好双击exe运行检测。
4.检测版本,可通过登录网址“https://ie.icoa.cn/”进行检测。
注册表修改方法一(需要管理员权限):
private void setRegedit() { try { string kernel = "11001"; string path = @"SOFTWAREWOW6432NodeMicrosoftInternet ExplorerMainFeatureControlFEATURE_BROWSER_EMULATION"; string name = "LoadJS.exe"; RegistryKey key = Registry.LocalMachine; RegistryKey software = key.OpenSubKey(path, true); software.SetValue(name, kernel, RegistryValueKind.DWord); key.Close(); } catch (Exception e) { MessageBox.Show(e.Message + e.StackTrace); } }
注册表修改方法二(无须管理员权限):
经测试,管理员权限和方法无关,和注册表路径位置有关。
/// <summary> /// 修改注册表信息使WebBrowser使用指定版本IE内核 /// </summary> public static void SetFeatures(UInt32 ieMode)//参数非类似6000,7000;代表edge浏览器,如,123 { if (LicenseManager.UsageMode != LicenseUsageMode.Runtime) { throw new ApplicationException(); } //获取程序及名称 string appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); string featureControlRegKey = "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\"; //设置浏览器对应用程序(appName)以什么模式(ieMode)运行 Registry.SetValue(featureControlRegKey + "FEATURE_BROWSER_EMULATION", appName, ieMode, RegistryValueKind.DWord); //不晓得设置有什么用 Registry.SetValue(featureControlRegKey + "FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION", appName, 1, RegistryValueKind.DWord); }