2009-03-02 195 views
2

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

回答

1

與VS2005打包安裝程序非常適合需要COM註冊項目打破。我花了大約2天的時間試圖讓它在幾年前正常工作,然後發現了免費的NSIS安裝程序,並且永不退縮。

看一看:

http://nsis.sourceforge.net/Main_Page

相關問題