2009-03-02 153 views
2

我有一个使用COM Interop在C#/ .NET 2.0中编写的IE BHO(工具栏)。我正在使用Visual Studio 2005为使用安装项目的工具栏生成MSI安装程序。安装项目COM注册

在我的组装,我有COM注册/使用ComRegisterFunctionAttribute,其设置,让IE浏览器的一些关键信息,有关我的工具栏(如工具栏的名称)的注册表项注销方法。在我的安装项目中,我使用vsdrpCOMRelativePath属性(请参阅下面的代码)注册我的DLL的COM。

当我安装MSI,工具栏功能正常,但我有一个唠叨的问题:当我启动IE并去选择我的工具栏,它出现在有效工具栏的列表中,但它具有完全限定的类名称:“MyToolbar.IEHelperToolbar”,而不是一个正常的名称:“IEHelperToolbar

它好像由安装项目生成的MSI并没有叫我在我的组件定义的自定义注册方法。我得出这个结论,因为如果我使用regasm.exe注册DLL,IE显示正确的名称。

我应该在我的安装项目中使用不同的注册设置,还是应该按照post中的方法操作:或者我应该放弃VS2005安装项目并转到WIX之类的东西,还是我离开基地?

这里是我的注册/注销功能:

/// <summary> 
/// Called when derived class is registered as a COM server. 
/// </summary> 
[ComRegisterFunctionAttribute] 
public static void Register(Type t) 
{ 
    string guid = t.GUID.ToString("B"); 

    RegistryKey rkClass = Registry.ClassesRoot.CreateSubKey(@"CLSID\" + guid); 
    RegistryKey rkCat = rkClass.CreateSubKey("Implemented Categories"); 

    ToolbarAttribute[] boa = (ToolbarAttribute[])t.GetCustomAttributes(
     typeof(ToolbarAttribute), 
     false); 

    string name = t.Name; 
    string help = t.Name; 
    ToolbarStyle style = 0; 
    if (boa.Length == 1) 
    { 
     if (boa[0].Name != null) 
      name = boa[0].Name; 

     if (boa[0].HelpText != null) 
      help = boa[0].HelpText; 

     style = boa[0].Style; 
    } 

    rkClass.SetValue(null, name); 
    rkClass.SetValue("MenuText", name); 
    rkClass.SetValue("HelpText", help); 

    if (0 != (style & ToolbarStyle.Vertical)) 
     rkCat.CreateSubKey("{00021493-0000-0000-C000-000000000046}"); 

    if (0 != (style & ToolbarStyle.Horizontal)) 
     rkCat.CreateSubKey("{00021494-0000-0000-C000-000000000046}"); 

    if (0 != (style & ToolbarStyle.TaskbarToolBar)) 
     rkCat.CreateSubKey("{00021492-0000-0000-C000-000000000046}"); 

    if (0 != (style & ToolbarStyle.ExplorerToolbar)) 
     Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Toolbar").SetValue(guid, name); 

} 

/// <summary> 
/// Called when derived class is unregistered as a COM server. 
/// </summary> 
[ComUnregisterFunctionAttribute] 
public static void Unregister(Type t) 
{ 
    string guid = t.GUID.ToString("B"); 
    ToolbarAttribute[] boa = (ToolbarAttribute[])t.GetCustomAttributes(
     typeof(ToolbarAttribute), 
     false); 

    ToolbarStyle style = 0; 
    if (boa.Length == 1) style = boa[0].Style; 

    if (0 != (style & ToolbarStyle.ExplorerToolbar)) 
     Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Toolbar").DeleteValue(guid, false); 

    Registry.ClassesRoot.CreateSubKey(@"CLSID").DeleteSubKeyTree(guid); 
} 

回答

1

与VS2005打包安装程序非常适合需要COM注册项目打破。我花了大约2天的时间试图让它在几年前正常工作,然后发现了免费的NSIS安装程序,并且永不退缩。

看一看:

http://nsis.sourceforge.net/Main_Page

相关问题