簡體   English   中英

使用自定義表單安裝項目

[英]Setup project with custom form

我目前正在研究Visual Studio 2010安裝項目,並且想知道是否可以進行以下操作:

1)以不顯示默認表單的方式運行安裝項目,相反,我將顯示自己的訂閱安裝項目事件的自定義表單。 這樣,我將顯示安裝消息並增加自己的進度欄。

2)如果可能為1,則需要一種方法來指定默認位置。

3)我有一個單獨的庫項目,在這里我有一個自定義安裝類(繼承自“ System.Configuration.Install.Installer”),它來自安裝處理程序,我希望能夠顯示自定義Windows窗體並控制選擇由用戶制作。 我猜可以通過添加對system.windows.forms的引用來實現,但這是否是解決此問題的正確方法? 如果我無法隱藏默認的安裝表單,這些自定義表單將顯示在默認的安裝表單上,我認為它看起來太好了。

建議,鏈接等,謝謝!

* 更新1 *

我可以從C#代碼中啟動.msi,但也可以傳入值嗎?

這個家伙在這里所做的: 鏈接

但是傳入一個值...然后從我的自定義安裝類中,我根據此值執行操作。

更新2

好像我可以: 鏈接代碼項目

更新3

我正在考慮進行以下操作,我將開始使用Winforms應用程序進行測試。

1)啟動winforms應用程序。
2)進行一些webService調用,顯示數據,用戶進行選擇。
3)按照更新1中的鏈接,啟動過程(靜默模式)和每個更新2中,傳遞選定的值。
4)使用一些跨進程事件機制(WCF),以便我的自定義安裝類可以將其運行和更新進度欄和消息的不同步驟通知我的表單。

您可以創建自定義表單,但聲明需要在MSI內部完成。 您可以通過自定義操作顯示自定義對話框,但這對您沒有多大幫助,因為msi這樣做:

  1. 加載自定義操作dll
  2. 如果已管理,則將啟動CLR並執行您需要的代碼
  3. 保留自定義操作后,將卸載dll並關閉clr

每次調用自定義操作都會完成此操作。 這是自定義操作通常用C ++編寫的主要原因之一。

為了更加靈活,您應該使用WIX工具包,該工具包允許與MSI一樣好地集成.NET。 MSI本身對.NET一無所知,並且是一個屬於自己的世界。 MSI本身通過諸如DialogControl表之類的表在msi中定義對話框和控件。 您可以創建一個對話框,並將狀態存儲在需要執行的每個msi操作之間的msi屬性中,例如,計算所選功能的磁盤空間等。 但是我懷疑這種解決方案是否有效,而且我擔心在一個進程中如此頻繁地啟動和關閉CLR會使您暴露於CLR錯誤中,而這是以前從未遇到過的。

要設置目標位置,您只需要調用MSI方法MsiSetTargetPath即可 ,可以很容易地PInvoke。

要禁用普通UI,可以相對於MsiSetExternalUI完全或部分覆蓋它,但我沒有嘗試僅禁用特定對話框。 如果要隱藏特定對話框,則應檢查當前MSI的msi表,以檢查是否可以設置msi屬性以使對話框認為它已經顯示。

您的Alois Kraus

據我所知,除非使用自定義操作,否則Visual Studio進行的安裝項目非常有限。 這些自定義操作可能會花費大量時間來創建和調試,因此使用更成熟/功能更強大的工具(例如Installshield)可能更明智。

編輯至於使用winforms顯示窗口:可以,但是:不錯的設置允許靜默/腳本安裝,請確保您允許。 需要注意的另一件事是機器沒有.NET,因此無法顯示表單...恕我直言,除非您確定存在.NET(正確的版本),否則是不行。

編輯2回應一些評論:在某些情況下,VISUAL STUDIO安裝和部署項目無法實現。 我並不是說Windows Installer不好。 例如,嘗試制作自定義安裝程序來確定將在哪里安裝應用程序,並跳過項目生成的標准窗口。 我並不是說自定義操作受到限制,但是恕我直言,這也不容易。

另外,當您要使用自定義WinForms而不是Installer表單時,必須確保在顯示任何(WinForm)窗口之前完成.NET框架的引導。 可能有可能,但是如果您希望進行這種自定義,則最好使用更靈活的工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM