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