Настройка регистрации проекта COM

У меня есть IE BHO (панель инструментов), написанный на C # /. NET 2.0 с использованием COM Interop. Я использую Visual Studio 2005 для создания установщика MSI для моей панели инструментов с помощью проекта установки.

В моей сборке у меня есть методы регистрации / отмены регистрации COM с использованием ComRegisterFunctionAttribute, которые устанавливают ключи реестра, которые предоставляют IE некоторую ключевую информацию о моей панели инструментов (например, имя панели инструментов). В моем проекте установки я регистрирую свою dll для COM с помощью свойства vsdrpCOMRelativePath (см. Код ниже).

Когда я устанавливаю с помощью MSI, панель инструментов работает правильно, но у меня есть одна неприятная проблема: когда я запускаю IE и выбираю свою панель инструментов, она появляется в списке допустимых панелей инструментов, но имеет полное имя класса: "< em> 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);
}

person Millhouse    schedule 02.03.2009    source источник


Ответы (2)


Установщик, входящий в состав VS2005, очень плохо подходит для проектов, требующих регистрации COM. Несколько лет назад я потратил около 2 дней, пытаясь заставить его работать должным образом, затем обнаружил бесплатный установщик NSIS и никогда не возвращался.

Посмотри на:

http://nsis.sourceforge.net/Main_Page

person Eric J.    schedule 31.07.2009

(Очень) поздний ответ, но эти вопросы дают хорошее обсуждение того, как это сделать, используя класс установщика и проект установки:

person Frank    schedule 30.08.2011