2

COM Interop を使用して C#/.NET 2.0 で記述された IE BHO (ツールバー) があります。Visual Studio 2005 を使用して、Setup Project を使用してツールバー用の MSI インストーラーを生成しています。

私のアセンブリでは、ComRegisterFunctionAttributeを使用して COM 登録/登録解除メソッドを使用しています。これは、ツールバーに関する重要な情報 (ツールバーの名前など) を IE に提供するレジストリ キーを設定します。私のセットアップ プロジェクトでは、vsdrpCOMRelativePathプロパティを使用して COM 用の dll を登録します (以下のコードを参照)。

MSI をインストールすると、ツールバーは正常に機能しますが、1 つの厄介な問題があります。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);
}
4

2 に答える 2

1

(非常に)遅い応答ですが、これらの質問は、インストーラークラスとセットアッププロジェクトを使用してこれを達成する方法についての素晴らしい議論を提供します:

于 2011-08-30T18:58:23.567 に答える
1

VS2005 に同梱されているインストーラーは、COM 登録が必要なプロジェクトでは非常に壊れています。数年前、私はそれを適切に動作させるために約 2 日間を費やしましたが、無料の NSIS インストーラーを発見し、二度と戻ることはありませんでした。

見て:

http://nsis.sourceforge.net/Main_Page

于 2009-07-31T17:32:02.193 に答える