C# 无法使BHO在64位中工作

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中根本不起作用。我也尝试过将文件放在程序文件的子文件夹中,但它根本不起作用

我正在研究IE11浏览器辅助对象。当我在x86中构建它时,它开始工作。问题是,我想在x64上使用该项目。BHO扩展在x64上构建时无法工作

扩展显示在InternetExplorer加载项屏幕中,但javascript弹出窗口未显示

DLL通过Visual Studio命令提示符以管理员身份使用x64版本的regasm注册,带有/不带
/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