我有一个使用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);
}