C# 无法使BHO在64位中工作
我正在研究IE11浏览器辅助对象。当我在x86中构建它时,它开始工作。问题是,我想在x64上使用该项目。BHO扩展在x64上构建时无法工作 扩展显示在InternetExplorer加载项屏幕中,但javascript弹出窗口未显示 DLL通过Visual Studio命令提示符以管理员身份使用x64版本的regasm注册,带有/不带C# 无法使BHO在64位中工作,c#,windows,internet-explorer,internet-explorer-11,bho,C#,Windows,Internet Explorer,Internet Explorer 11,Bho,我正在研究IE11浏览器辅助对象。当我在x86中构建它时,它开始工作。问题是,我想在x64上使用该项目。BHO扩展在x64上构建时无法工作 扩展显示在InternetExplorer加载项屏幕中,但javascript弹出窗口未显示 DLL通过Visual Studio命令提示符以管理员身份使用x64版本的regasm注册,带有/不带/codebase和/tlb,但没有结果。注册表项已成功添加到我的注册表中,但BHO在IE中根本不起作用。我也尝试过将文件放在程序文件的子文件夹中,但它根本不起作用
/codebase
和/tlb
,但没有结果。注册表项已成功添加到我的注册表中,但BHO在IE中根本不起作用。我也尝试过将文件放在程序文件的子文件夹中,但它根本不起作用
当我在增强保护模式下运行IE时,附加模块管理器显示我的BHO不兼容,但如果没有EPM,IE显示启用,即使它不工作
我想让BHO在x64上工作
我也尝试过,但当我将其改为基于x64而不是x86时,同样的问题也会出现 Regasm.exe(程序集注册工具)
检查项目设置以64位编译,并检查IE版本。并在管理员模式下运行它
你的代码是完美的。只是系统设置和编译配置混乱
还可以查看此设置
希望这能帮到你 似乎它并不适用于所有人,因此,我将描述一下我是如何使它起作用的 1) 从此处下载示例项目: 2) 在
BHO.cs
发件人:
致:
3) 编译AnyCPU的项目:项目属性,为平台目标选择AnyCPU
4) 像这样创建一个.bat,调整路径,并将其复制到输出dll旁边:
"c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" ieextension.dll /codebase
"c:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" ieextension.dll /codebase
这将注册x86和x64的dll。必须注册两个版本,否则IE将不喜欢它(它会抱怨扩展“不兼容”),因为它将无法启动,具体取决于您的IE设置。注意:我想每个版本可以有两个不同的文件,但是.NET的AnyCPU不需要
5) 以管理员身份运行该.bat,以下是我执行此操作时的输出:
"c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" ieextension.dll /codebase
Microsoft .NET Framework Assembly Registration Utility version 4.7.2046.0
for Microsoft .NET Framework version 4.7.2046.0
Copyright (C) Microsoft Corporation. All rights reserved.
RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can cause your assembly to interfere with other applications that may be installed on the same computer. The /codebase switch is intended to be used only with signed assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully
"c:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" ieextension.dll /codebase
Microsoft .NET Framework Assembly Registration Utility version 4.7.2046.0
for Microsoft .NET Framework version 4.7.2046.0
Copyright (C) Microsoft Corporation. All rights reserved.
RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can cause your assembly to interfere with other applications that may be installed on the same computer. The /codebase switch is intended to be used only with signed assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully
6) 运行iexplore.exe
。它可能会根据您的设置工作(显示“HOLA!!!”消息框),但无论如何,请转到菜单工具/Internet选项/程序/管理加载项,我看到的是:
如果该扩展被禁用,您应该能够启用它(并重新启动)
如果它不工作(默认情况下不应该),请确保已选中“为增强的保护模式启用64位进程*”(需要重新启动)。对我来说,这个消息是错误的,它应该说“启用64位进程”
提供的示例对我来说是64位的。您必须1)编译x64 2)使用
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe ieextension.dll/codebase进行注册(由于有了codebase,无需复制到程序文件),3)确保主iexplore.exe运行64位,4)确保在IE中选中“为增强保护模式启用64位进程”“s工具/选项/高级。仅供参考,我没有启用“启用增强保护模式”。在我看来,[ComRegisterFunction]方法非常失败,它只写入BHO密钥,但无法写入CLSID密钥@西蒙,你是怎么做到的?您是否也做了CodeProject作者可能做过的同样的事情,并且一开始没有[ComRegisterFunction]的代码版本?@HansPassant-是的,我忘了说我将RegisterHo更改为registryKey.OpenSubKey(guid,true)代码>能够编写密钥,但这是我唯一做的更改。Regasm 64必须以管理员身份运行(对于HKLM中的更改,与往常一样),加上我之前评论中的安装IE选项。真糟糕,还有那个。这仍然让我困惑,任何人是如何做到这一点的,我怀疑他们的项目启用了“注册COM互操作”复选框。但当然,在64位模式下不起作用。不会在另一台机器上工作。好的,[ComRegisterFunction]必须调用RegistrationServices.RegisterAssembly(Assembly.GetExecutionGassembly(),AssemblyRegistrationFlags.SetCodeBase),这样CLSID键才能正确写入,IE才能找到DLL,mscoree.DLL才能加载它。@HansPassant-我发布了一个答案,我认为必须为同一CLSID注册x86和x64版本,才能让IE满意。Simon,从屏幕截图中我看到您没有勾选“启用增强保护模式”。您如何知道它使用的是增强保护模式?我认为不是,这就是为什么它对你有用。
"c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" ieextension.dll /codebase
"c:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" ieextension.dll /codebase
"c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" ieextension.dll /codebase
Microsoft .NET Framework Assembly Registration Utility version 4.7.2046.0
for Microsoft .NET Framework version 4.7.2046.0
Copyright (C) Microsoft Corporation. All rights reserved.
RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can cause your assembly to interfere with other applications that may be installed on the same computer. The /codebase switch is intended to be used only with signed assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully
"c:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" ieextension.dll /codebase
Microsoft .NET Framework Assembly Registration Utility version 4.7.2046.0
for Microsoft .NET Framework version 4.7.2046.0
Copyright (C) Microsoft Corporation. All rights reserved.
RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can cause your assembly to interfere with other applications that may be installed on the same computer. The /codebase switch is intended to be used only with signed assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully