为什么我的附加组件在Internet Explorer上查看“管理附加组件”菜单?

时间:2016-04-18 17:33:43

标签: c# internet-explorer setup-project add-on

我正在为Internet Explorer 11编写附加组件。

我已经添加了guid变量:

 [ComVisible(true), Guid("86524891-49EB-4F46-BAE3-C5545B81A671"), ClassInterface(ClassInterfaceType.None)]

已经添加了对MSHTML和SHDocVw的引用 并且已经编写了ComRegister函数,取消注册函数

[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);
    }

    ourKey.SetValue("Alright", 1);
    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);
    }
}

我已经设置/获取网站功能:

public int SetSite([MarshalAs(UnmanagedType.IUnknown)] object site)
{
    if (site != null)
    {
        webBrowser = (SHDocVw.WebBrowser)site;
        webBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
        webBrowser.BeforeNavigate2 += new DWebBrowserEvents2_BeforeNavigate2EventHandler(this.OnBeforeNavigate2);
        webBrowser.NavigateComplete2 += WebBrowser_NavigateComplete2;
    }
    else
    {
        webBrowser.DocumentComplete -= new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
        webBrowser.BeforeNavigate2 -= new DWebBrowserEvents2_BeforeNavigate2EventHandler(this.OnBeforeNavigate2);
        webBrowser.NavigateComplete2 -= WebBrowser_NavigateComplete2;
        webBrowser = null;
    }

    return 0;
}

private void WebBrowser_NavigateComplete2(object pDisp, ref object URL)
{
}

public int GetSite(ref Guid guid, out IntPtr ppvSite)

{         IntPtr punk = Marshal.GetIUnknownForObject(webBrowser);         int hr = Marshal.QueryInterface(punk,ref guid,out ppvSite);         Marshal.Release(朋克);         返回小时;     }

然后我添加了一个设置项目:

Setup project propery İmage

因此,当我设置项目时,我无法在Internet Explorer中看到我的“加载项”。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

如果您认为这是注册问题,那么您应该显示BHOKEYNAME的定义。站点功能也不太可能与部署相关,因为当您的BHO正确连接时,浏览器会调用它们。

目前还不清楚其他什么"布线"您可能已经或可能没有进入您的安装项目。 Windows Installer不仅会调用这些寄存器功能。你必须安排以某种方式发生 - 当你处于开发模式(而不是部署模式)时,RegAsm.exe会做什么,但这对于安装项目来说是棘手的。

另一件似乎缺少的是COM部分。如果您的Dll需要注册COM,则您的安装项目中似乎没有任何内容可以进行任何COM注册。

所以我相信至少有两件事需要做:

  1. 您的Dll似乎需要COM注册,因此您应该在文件系统视图中转到Dll的属性窗口并选择vsdr COM设置。

  2. 如果您需要创建BHO注册表项,那么为什么不在安装项目中使用注册表视图?创建(并自动卸载)注册表项的所有功能都在那里,您根本不需要任何代码来完成这项工作。