让 .NET 程序 Autorun
最近,在群里討論的時候看到一個很有趣的需求,所以研究了一下。下面是研究出來來的結果。
?
有沒有想過,想用.NET做一個演示程序或者做個光盤的MENU。但卻苦于,機器上沒有.NET 而無法運行。
或許你認為這個很簡單,做個安裝程序不就可以了,但實際上,這樣自動運行的程序,不適合制作安裝程序, 或者說,他應該不需要安裝。
也許你認為這個也容易,用Dot NET 虛擬機不久好了。沒錯,用這個,確實可以,不過會有幾個問題。
第一,會有一個兼容性的問題。畢竟精簡了.NET 類庫,只有幾個少數文件。
第二,版權問題。
實際上,大家可能都沒有注意這個問題,但如果自己找,還是有人說的,飛信 用的那個虛擬機,是購買而來的。因此,你用了用了,就算是盜版了。這個問題,在國內,或許沒人深究,但在國外就不同了,這也是我寫本文的原因之一。
還有,另一種,解決方式,就是用VC++ 寫一個引導,不過這對于我們這些不熟悉VC的人,是一個麻煩。
?
不知道,大家最近有沒有關注 SQL2008呢?嘗試過的人,一定會發現一個很細節的不同,那就是,安裝的引導界面不同了。
實際上,在這個之前,還會有一個東西出來,那就是,提示你 安裝 .NET Framework 3.5 SP1 。為什么會這樣呢?因為,新的引導程序,就是.NET 做的了。
?
?
本文,將會指導你,如何讓VS幫助我們生成這樣的Loader,在沒有安裝.NET 的機器上,自動安裝.NET Framework, 在已安裝的機器上,直接運行程序。
注意: 由于需要手動修改項目文件, 因此操作錯誤,可能會使項目出現問題。請在對已有的工程修改前,做好備份。
先說一下原理, 做Client程序,應該都會知道ClickOnce,通過它,可以快速制作一個安裝程序,來部署項目。在部署的時候,選擇依賴,這樣在安裝的時候,如果客戶端,沒有相應的組件,就會自動安裝。這個就是Bootstrapper,用于檢查程序依賴項,并自動安裝的啟動程序。我們的任務,就是定這個Bootstrapper,將它指向的安裝程序,對準我們實際要運行的程序,這樣就達到了上面的目的。
那么我們開始吧,這里,為了演示,我將新建一個Win Form程序, 當然,你也可以用一個已有的項目,不過,記得要備份哦!
1、新建一個項目,名字為 AutorunDotNet。 這里要說明的是,我選擇的是.NET 3.5,實際上,你也可以選擇.NET 2.0 的程序。另外,要說的一點是,我用的是VB.NET ,但實際上,我們是修改的項目文件,和語言無關。
????? ????
2、簡單修改一下項目。 (實際上,可以不用做這個。)
??????????
3、設置項目依賴。
a.雙擊解決方案中的“My Project” ,打開項目屬性頁。
?? ??
b.選擇 “發布” 選項卡, 單擊 “系統必備”。
??????
c.在“系統必備”里, 確保選擇 “ 創建用于安裝系統必備組件的安裝程序”, 然后 下發,選擇 需要安裝的系統必備組件。 最后,在“指定系統必備組件的安裝位置” 里,選擇 “從與我的應用程序相同的位置下載系統必備組件”, 單擊 確定 。(注:你可以不必設置這個,這樣,安裝程序,會在網絡上下載,安裝程序。)
??????
?
?
恩,準備工作差不多了。下面開始修改項目文件吧。
?
4、編輯項目
a.卸載項目
?????? 右鍵單擊項目, 選擇 “卸載項目”
??????????? ?
???????? 注:如果,VS沒有顯示, 需要打開 “工具” ——“選項”,找到“項目和解決方案”, 選擇 “總是顯示解決方案”。
???????????
b.編輯項目
? ?????? 右鍵 單擊“AutotrunDotNet”,選擇“編輯 AutorunDotNet.vbProj”。
??????????????? ?
?
5、在開的項目文件里,找到以下內容。(默認在項目結尾)
a.將這段內容改成如下樣子。
?
Code<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. -->
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
<GenerateBootstrapper
ApplicationFile="$(TargetFileName)"
ApplicationName="$(AssemblyName)"
ApplicationUrl="$(_DeploymentFormattedApplicationUrl)"
BootstrapperItems="@(BootstrapperPackage)"
OutputPath="$(TargetDir)"
ComponentsLocation="$(BootstrapperComponentsLocation)"
Path="$(GenerateBootstrapperSdkPath)" />
</Target>
?
?
?
b.修改好后,保存。 在右鍵 單擊“AutorunDotNet”項目,選擇“重新加載項目”。
?
?
6、OK,修改完成。編譯一下看看。
?
如果沒有錯誤,你將會在輸出的文件夾下,看到一下內容。
?
??
?
這個Setup.exe,就是我們要的Loader。 2個文件夾里的是.NET 安裝程序 和 Windows Installer 3.1 。
?
補充一點, 這個方法,目前還不能自動生成 Autorun.inf 。
因此只能我們自己手動寫一個了,不是很難。( 雖然我很想人讓它自動,生成,但沒有找到相關資料。)
?Autorun.inf
[autorun]open=setup.exe
icon=setup.exe,0?
其他說明
這個,我在VS2008 SP1上測試的, 根據MSDN的說法, 這個最低適用于 VS2005
如果怕影響當前項目,可以新建一個項目,專門用來做這個~
?
還有這里,簡單說明一下 <GenerateBootstrapper > 就是用來生成實Bootstrapper 。
ApplicationFile="$(TargetFileName)" 這個指定要運行的程序名字,這里這個參數,是默認項目輸出的名字。
ApplicationName="$(AssemblyName)" 程序的名字,即在執行的時候,提示的。這里是程序集的名字。
OutputPath="$(TargetDir)" 輸出位置, 這里默認是項目輸出的文件夾
其他的屬性,請參考http://msdn.microsoft.com/zh-cn/library/ms164294.aspx
?
事例代碼在這里下載 http://code.msdn.microsoft.com/AutorunDotNET
?
?
在這里簡述一下,當初在群提出這個問題的情況。(由于實際信息,可能不方便說書,所以,決定,不說!!)
?
這個公司,給客戶做了一個網站的演示程序,用WinForm作的。 之后,要把這個程序刻錄到光盤,送給客戶。
但因為是.NET 做的, 在沒有.NET 的機器上,程序就無法運行。?反之,有因為商業程序,客戶不見得會懂得很多開發信息。也不好讓客戶自己安裝.NET 。
所以,需要一個確保的機制。 在沒有.NET的機器上自動安裝,之后并自動運行程序。
實際上,當時在討論的時候,說了2點,一是 用 飛信的虛機, 二是寫一個VC++的程序。
但這2點 都不符合, 一是,客戶是 國外的,對用了帶版權的東西,有多說頭。 二是, 他們公司里面的沒有人懂VC++。
?
?
=================
Q&A
=================
Q:錯誤 1 系統必備的安裝位置未設置為“組件供應商的網站”,無法在磁盤上找到項“.NET Framework 3.5 SP1”中的文件“DotNetFX35SP1\dotNetFX20\aspnet.msp”。有關詳細信息,請參見“幫助”。
A:VS 2008 SP1 升級后,并沒安裝.NET 3.5 SP1 完整版的 Bootstrapper,而只是復制了幾個文件。 因此,默認是按配置中的信息,從網絡上下載的在線安裝版本。 你可以按照下面的方法,制作離線的完整版。或者在這里下載完整版的 復制到 Bootstrapper下。
?
下面是官方的方法。
?
更新包數據
1、打開 [Program Files]\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\DotNetFx35SP1 文件夾。
2、在“記事本”中編輯 Product.xml 文件。
將下面的內容粘貼到 < PackageFiles > 元素中:
< PackageFile Name="TOOLS\clwireg.exe" />
< PackageFile Name="TOOLS\clwireg_x64.exe" />
< PackageFile Name="TOOLS\clwireg_ia64.exe" />
下載并提取核心安裝文件
1、導航到以下 URL:http://go.microsoft.com/fwlink?LinkID=118080
2、將 dotNetFx35.exe 文件下載到本地磁盤上。
3、打開“命令提示符”窗口,然后更改到下載 dotNetFx35.exe 的目錄。
4、在命令提示符下鍵入:
dotNetFx35.exe /x:。
5、這可將 Framework 文件提取至當前目錄下的一個名為 “WCU” 的文件夾中。
復制 WCU\dotNetFramework 文件夾的內容并將其粘貼到 %Program Files%\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\DotNetFx35SP1 文件夾中(在 x64 操作系統上為 %ProgramFiles(x86)%\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\DotNetFx35SP1)。注意:請不要復制 WCU\dotNetFramework 文件夾自身。WCU 文件夾下應包括 5 個文件夾,現在每個文件夾應顯示在 DotNetFx35SP1 文件夾中。文件夾結構應類似下面這樣:
DotNetFx35SP1(文件夾)
dotNetFX20(文件夾)
dotNetFX30(文件夾)
dotNetFX35(文件夾)
dotNetMSP(文件夾)
TOOLS(文件夾)
en(一些其他本地化文件夾)
dotNetFx35setup.exe(文件)
?
現在可以刪除在步驟 2 和步驟 4 中下載和提取的文件和文件夾。?
?
下載語言包支持文件
?
1、有關下載位置,請參考下表。
2、導航至所提供的 URL,出現提示后,下載到表中所指示的 dotNetFx35SP1 文件夾的子目錄中。注意:必須對 x86 和 x64 文件各執行一次該操作,即使您的包無需支持 x64 也是如此。
簡體中文、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118146" ,目標:zh-CHS\DotNetFX35\x86)
簡體中文、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118151" ,目標:zh-CHS\DotNetFX35\x64)
繁體中文、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118087" ,目標:zh-CHT\DotNetFX35\x86)
繁體中文、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118050" ,目標:zh-CHT\DotNetFX35\x64)
英語:N/A
法語、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118148" ,目標:fr\DotNetFX35\x86)
法語、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118153" ,目標:fr\DotNetFX35\x64)
德語、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118149" ,目標:de\DotNetFX35\x86)
德語、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118154" ,目標:de\DotNetFX35\x64)
意大利語、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118097" ,目標:it\DotNetFX35\x86)
意大利語、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118115" ,目標:it\DotNetFX35\x64)
日語、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118096" ,目標:ja\DotNetFX35\x86)
日語、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118114" ,目標:ja\DotNetFX35\x64)
朝鮮語、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118147" ,目標:ko\DotNetFX35\x86)
朝鮮語、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118152" ,目標:ko\DotNetFX35\x64)
葡萄牙語 – 巴西、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118092" ,目標:pt-BR\DotNetFX35\x86)
葡萄牙語 – 巴西、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118110" ,目標:pt-BR\DotNetFX35\x64)
俄語、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118090" ,目標:ru\DotNetFX35\x86)
俄語、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118108" ,目標:ru\DotNetFX35\x64)
西班牙語、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118101" ,目標:es\DotNetFX35\x86)
西班牙語、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118119" ,目標:es\DotNetFX35\x64)
???????--------------------------------------------------
如果,你下載完之前的,可以下載Product.XML 的更新?http://www.mediafire.com/file/gol0tgw71uu/product.rar
?
http://www.mediafire.com/file/zgsnbnamakd/DotNetFX35SP1.part1.rar
http://www.mediafire.com/file/pxuewxs5rcm/DotNetFX35SP1.part2.rar
http://www.mediafire.com/file/kovaclwgvez/DotNetFX35SP1.part3.rar
?
將以上文件解壓至 Bootstrapper 文件夾下即可。
如果鏈接出現問題,請回復。
?
PS.本打算,直接分享一個來的, 結果,看了一下容量, 我暈倒了。 316MB
如果能找到一個好的空間的話, 稍后會上傳上來。
?
在這里說一個題外話,很多人都說.NET 太大了。 實際上,一點點細節沒有注意。
.NET 3.5 之后,提供的程序包,里面,實際上包含了 X64 和X86 2個平臺的安裝程序。另外,由于,Vista 以上的系統內置.NET ,因此,對這個平臺的安裝,又使用了MSU。所以,最終,的結果是,包含了2類系統的安裝程序,每種又有X86和X64平臺的安裝文件。
PS.剛才瞄了一下,MSU里,居然還有一個安騰的X64。那上面的就。。。
?
Q:怎樣更改引導程序的圖標和名稱呢?
A:很抱歉,這個生成,圖標資源,無法更改。因此,圖標只能。。。? 以后可能會研究看看,但希望恐怕不大, 因為 VS 所有生成的 安裝程序(ClickOnce和MSI) 都是這個圖標。但聽說ClickOnce ,在.NET 3.5 SP1 有夠個重大變革,可以自定義安裝界面。不過這個還沒有深入研究。如果,放入到光盤上的話,可以通過修改Autorun.inf 更改光盤的顯示圖標。
[autorun]
open=setup.exe
icon=AutorunDotNet.exe,0
將Icon指定光盤的圖標,可以是個ICO文件。
至于,文件名稱,這個可以自由更改,沒有限制。
轉載于:https://www.cnblogs.com/GSonOVB/archive/2008/09/02/1280685.html
總結
以上是生活随笔為你收集整理的让 .NET 程序 Autorun的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js全选 复选框的问题
- 下一篇: 压缩信息立方体和集合技术内幕