2010-03-26 89 views
8

我必須使用InstallSheild將多個程序集註冊到GAC,並且還需要將程序集複製到INSTALLDIR上。什麼是最好的方式來做到這一點?我還需要爲程序集調用regasm.exe;我可以使用InstallShield來做到這一點嗎?使用InstallShield將組件註冊到GAC

對於每個需要在GAC中註冊的程序集,我真的需要一個新的「組件」嗎?

回答

10

本答案假定您使用的是Windows Installer項目類型。

1)爲每個DLL文件創建一個組件,將其作爲密鑰文件並將目標文件夾設置爲GlobalAssemblyCache。這指示Windows安裝程序使用MsiPublishAssemblies標準操作,該操作反過來會調用Fusion以在GAC中註冊程序集。這實際上是GACUTIL爲您做的。請記住:GACUTIL不是可再發行的。如果程序集具有伴隨文件,請將它們作爲伴隨文件添加到相同的組件。 2)如果您的程序集是ComVisible,則爲每個DLL創建一個組件,將其標記爲密鑰文件並將.NET ComInterop設置爲true。這將導致在構建時提取COM信息,並告訴Windows安裝程序使用MsiPublishAssemblies標準操作將信息寫入註冊表。注意:如果您在程序集的註冊部分有自定義用戶代碼,則不會被捕獲。這是每個MSDN regasm /regfile不執行此代碼路徑。您必須手動將此信息輸入到該組件的InstallShield註冊表視圖中。

3)是的,您可以在全局和/或私人部署強名稱的程序集。是否可以看到私人組件取決於具有參考組件的組件是否具有UseSpecific組件。

+0

不錯的一個慢跑我的記憶克里斯! – 2014-04-03 17:51:40

0

是的。就係統而言,這是兩個不同的文件。 AFAIK,您不能在GAC中擁有文件,並且它同時位於目標計算機上的隨機文件夾中。

理論上講,如果它在GAC中,則不需要它在產品目錄中。如果它在GAC中,那將是加載的版本,而不是產品目錄中的版本。但是,如果您需要爲COM互操作註冊它,則會變得更加困難。我可能是錯的,但是當我嘗試時,我必須同時擁有:一個在目錄中,一個在GAC中。

但實際上,如果您在產品目錄中需要它,您可能不需要它在GAC中。如果它始終在任何地方從任何程序加載,那麼GAC對它來說是一個體面的地方。如果您將其放入GAC for COM互操作中,那就沒有必要了;通過將它指向已安裝的文件夾來註冊它,如果您正確配置了installshield,則可以正常工作。

+0

我在C#中開發了一個Windows工具欄。在這種情況下,dll應該在GAC中,對嗎? – Cornel 2010-03-26 16:25:22

+0

不一定。如果您的工具欄的使用者在他們的應用程序中使用它,那麼他們只需要在您的應用程序的文件夾中。 – 2010-03-26 17:31:52