У меня есть IE BHO (панель инструментов), написанная на C # /. NET 2.0 с использованием COM Interop. Я использую Visual Studio 2005 для создания установщика MSI для моей панели инструментов с помощью проекта установки.
В моей сборке у меня есть методы регистрации / отмены регистрации COM, использующие ComRegisterFunctionAttribute , который устанавливает ключи реестра, которые дают IE некоторую ключевую информацию о моей панели инструментов (например, имя панели инструментов). В моем проекте установки я регистрирую свою dll для COM, используя свойство vsdrpCOMRelativePath (см. Код ниже).
Когда я устанавливаю с MSI, панель инструментов функционирует нормально, но у меня есть одна неприятная проблема: когда я запускаю IE и выбираю свою панель инструментов, она появляется в списке допустимых панелей инструментов, но у нее есть полное имя класса : " MyToolbar.IEHelperToolbar " вместо обычного имени: " IEHelperToolbar "
Кажется, что MSI, сгенерированный проектом установки, не вызывает пользовательские методы регистрации, которые я определил в моей сборке. Я пришел к такому выводу, потому что если я использую regasm.exe для регистрации DLL, IE отображает правильное имя.
Должен ли я использовать другой параметр регистрации в моем проекте установки, или я должен следовать подходу, описанному в этом посте :, или я должен просто отказаться от проекта установки 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);
}