共用方式為


大內高手專欄:

工具介紹:Thinstall

作者:蔡學鏞

2004 年 9 月

軟體開發完畢,需要開始考慮到部署 (deployment) 的問題。部署往往不是一件簡單的事,有一些問題需要解決。早期,Java 尚未普及時,許多 Java 程式員都會面臨一個困擾,那就是:用 Java 開發出來的軟體,不保證可以在其他人的 PC 上執行,因為別人可能沒有安裝 JRE (Java Runtime Environment,Java 執行環境)。即使有安裝 JRE,JRE 的版本可能也不對。即使是現在,這個問題依然存在。

同樣地,.NET現在也遇到這個問題。目前,只有 Windows Server 2003 預先安裝好 .NET Framework,其他的作業系統都沒有預先安裝 .NET Framework。這會造成有些公司在評估開發工具時,會捨棄 .NET,而就 MFC,甚至回到 Win32 API,畢竟 MFC 和 Win32 的 DLL 在所有的 Windows 平台上都有。我常覺得這可稱為「舊技術不死,只是凋零」,凋零得還真慢呢!

如果讓安裝程式將 .NET Framework 附在其中,會造成一些問題:安裝 .NET Framework 時需要有足夠的權限,權限不夠則無法安裝。例如,Guest 帳戶無法存取 Registry,安裝 .NET Framework 需要存取 Registry。另外,體積也是一個大問題,.NET Framework 下載超過 20MB(安裝後超過100MB)。

幸好,有一些軟體廠商提供工具可以解決此問題,Thinstall 正是一個這樣的工具。在 .NET Framework 尚未普及的今日,這樣的工具更顯得重要。Thinstall 是 Jitit 公司的產品,你可以在 http://thinstall.com/ 找到它的資料,以及下載 30 天試用版。

顧名思義, Thinstall 是 Thin-Install 的意思,讓軟體免於安裝的困擾。利用 Thinstall ,可以將一個軟體的許多檔案包裝 (package) 成一個 EXE 檔,不需要解壓縮,不需要安裝 (install),就可以直接執行。利用 Thinstall ,你可以將 .NET Framework 和你的程式,以及相關的檔案都包裝在一起,變成一個自給自足的 EXE 檔。

除了將 .NET Framework 包裝進 EXE 之外,Thinstall 還有一些額外的好處,包括了:

  • 可以將 3rd Party 程式庫,以及相關的檔案,都包裝在一個 EXE 檔中,讓程式執行時,不會有檔案遺失的狀況。
  • Thinstall 使用的壓縮技術,壓縮比例可以比 ZIP 或 RAR 更高。
  • Thinstall 並不會將整個 .NET Framework 都包裝進 EXE,只把有使用到的部分包裝進 EXE,加上使用壓縮技術,這使得包裝出來的程式體積不大,一般都在 3~8MB 之間。
  • Thinstall 有使用加密技術,可以保障資料檔案不會輕易地被他人窺視與竄改,程式也更不容易被反編譯和反組譯。
  • Thinstall 整合安裝程式的功能,可以建立開始選單 (Start Menu) 與桌面捷徑 (Desktop Shortcut)。
  • Thinstall 可以讓軟體變成 30 天試用版 (Trial)。

使用 Thinstall 也不是全然沒有缺點,最明顯的缺點是,執行效率會或多或少受到影響,且浪費更多記憶體。我的經驗是,大多數的程式感覺不出效率變差,但某些用到特殊的技巧的程式,其效率的確變差了。另外,使用 Thinstall 時,必須考慮到法律的問題。因為 Thinstall 將許多程式庫都包裝進來,這些別人開發的程式庫 (包括.NET Framework) 是否可以隨著你的 EXE 而散播,Thinstall 的使用者需要好好研究其授權方式。

Thinstall 的使用方式非常容易,你可以在 Thinstall 的網站上看到用法介紹。較值得注意的是,Jitit 公司不希望 Thinstall 產品被不合法地盜用,所以對於 Thinstall 的保護相當嚴格。使用 Thinstall 時,電腦必須能上網,因為 Thinstall 需要連線到 License Server,來得知你是否為合法的用戶 (或試用戶),否則將不能執行 Thinstall。你也可以向他們購買 USB 的 Key,就可以不用上網,離線使用 Thinstall。

Thinstall 可以利用PE檔案格式的 Import Table,以及利用 .NET Metadata Table 內記錄的資訊,來得知此程式使用了哪些 DLL,Thinstall 會自動加入這些 DLL,甚至連間接使用到的 DLL (也就是 DLL 所使用的 DLL),也會被自動加入。但是,Thinstall 無法得知程式中利用 Win32 的 LoadLibrary() 或 .NET的Assembly.Load() 等API所動態載入的 DLL 有哪些,所以使用者必須自行將這些 DLL 加入到 Thinstall 中,以免包裝出來的 EXE 檔殘缺不全。

Thinstall 採用的機制相當巧妙,利用一個 Virtual OS 將程式和 OS 隔開來。如果你的程式是 .NET 程式,則在你的程式和 Virtual OS 之間,還有一個 .NET CLR,如圖 1 所示:

對 1
圖 1

如果你利用Thinstall來包裝.NET程式,那麼Thinstall所產生出來的EXE檔內,除了包含你的原始EXE檔之外,還有.NET Framework,以及Thinstall Virtual OS,如圖2所示。

對 2
圖 2

Thinstall Virtual OS 重新改寫了 300+ 個 Win 32 API,這些 API 大都是和檔案、Registry、Process 等有關。Virtual OS 內有自己的 Virtual File System 和 Virtual Registry。這些被改寫的 API,將 Virtual File System 和 Real File System 整合起來,成為一個新的 File System;將 Virtual Registry 和 Real Registry 整合起來,變成一個新的 Registry。

當系統載入此 Thinstall 包裝出來的 EXE 時,Virtual OS 會先被載入,Virtual OS 會接著載入原始的 EXE (以及.NET Framework),然後解壓縮與解密、並該更改此 EXE(以及.NET Framework) 所使用到的這 300+ API,使其呼叫到 Virtual OS 的版本,而不是 Real OS 的版本。最後把執行權交給此 EXE。偷天換日的工作,於是完成!

因為 Thinstall 內部使用這套 Virtual OS 的機制,而不是針對 .NET 來設計一個專屬的機制,所以 Thinstall 除了用來包裝 .NET 程式,也可以用來包裝 Java 程式,甚至 VB,或其他程式。我覺得這是一套很方便的工具,值得您也試試。

意見與支援

 您有任何問題、意見或建議嗎?您可以透過下列電子郵件與作者連絡:
 xy.cai@msa.hinet.net

更多資訊

想知道大內高手專欄的其他文章嗎?請至此專欄所有列表