杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2467|回复: 0

Setup Factory 7.0打包.NET Framework 的方法

[复制链接]
发表于 2017-2-26 15:43:52 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本文介绍一个工具:Setup Factory。在7.0版本中,Setup Factory的默认从属资源中仅支持VB5.0及VB6.0,想要在生成的安装程序中自动完成.NET FRAMEWORK的安装,从网上查了一下,须要按以下步骤做几件事:
首先找到Setup Factory安装目录下的Dependencies目录,在目录中新建一个dotnet2_0.xml的文件。
然后,在Dependencies目录下新建子目录,取名dotnet2_0,将.NET FRAMEWORK安装程序dotnetfx.exe拷至该子目录下,dotnetfx.exe可在VS 2005的安装目录下的SDK//v2.0//BootStrapper//Packages//dotnetfx目录下找到。
完成之后打开Setup Factory,选择:资源---从属---添加,可以看到.NET FRAMEWORK 2.0了。
文件dotnet2_0.xml内容如下:
  1. < DependencyTemplate >

  2. < Dependency >

  3. < Name > Microsoft.NETFramework2.0 </ Name >

  4. < RuntimeTempFolder > dotnet2_0 </ RuntimeTempFolder >

  5. < RevisionDate > Friday,March30,2007 </ RevisionDate >

  6. < Description > 安装Microsoft.NETFramework2.0应用程序所需的运行时文件。 </ Description >

  7. < DetectScript >

  8. functionisDotNet_Installed()

  9. --author:zhengxinhewww.admans.net

  10. --Outputtothelogthatthe.NETdetectionhasstarted.

  11. SetupData.WriteToLogFile("Success/t.NET2.0Module:Detectionscriptstarted./r/n",true);

  12. --Gettheoperatingsystemname.

  13. --Checktoseeiftheregistrykeyexists

  14. DotNet_Registry=Registry.DoesKeyExist(HKEY_LOCAL_MACHINE,"Software//Microsoft//.NETFramework");

  15. if(DotNet_Registry==nil)then

  16. --Theregistrykeydoesnotexist

  17. --Runthe.NETInstallationscript

  18. --Outputtothelogfilethat.NETcouldnotbefound,soitwillbeinstalled.

  19. SetupData.WriteToLogFile("Info/t.NET2.0Module:Noversionof.NET2.0fileswasfound..NET2.0willbeinstalled./r/n",true);

  20. returnfalse;

  21. end

  22. --Thekeydoesexist

  23. --Getthe.NETinstalllocationfromtheregistry

  24. DotNet_Install_Location=Registry.GetValue(HKEY_LOCAL_MACHINE,"Software//Microsoft//.NETFramework","InstallRoot",true);

  25. --Lookforthefilemscorcfg.dll

  26. Does_File_Exist=DotNet_Install_Location.."//v2.0.50727//aspnet_rc.dll";

  27. if(notFile.DoesExist(Does_File_Exist))then

  28. --Thefiledoesnotexist

  29. --Runthe.NETInstallationscript

  30. --Outputtothelogfilethat.NETcouldnotbefound,soitwillbeinstalled.

  31. SetupData.WriteToLogFile("Info/t.NET2.0Module:Noversionof.NET2.0filewasfound..NET2.0willbeinstalled./r/n",true);

  32. returnfalse;

  33. end

  34. --Thefiledoesexist

  35. --Gettheversionofmscorcfg.dll

  36. msc_ver=File.GetVersionInfo(Does_File_Exist);

  37. if(notmsc_ver)then

  38. SetupData.WriteToLogFile("Info/t.NET2.0Module:noversionwasfound..NET2.0willbeinstalled./r/n",true);

  39. returnfalse;

  40. end



  41. --Comparethereturnedvalueagainsttheneededvalue

  42. Compare=String.CompareFileVersions(msc_ver.FileVersion,"2.0.50727.42");

  43. if(Compare==-1)then

  44. --Outputtothelogfilethatalesserversionof.NETwasfoundonthesystem

  45. SetupData.WriteToLogFile("Info/t.NET2.0Module:Alesserversionof.NET2.0("..msc_ver.FileVersion..")wasfoundontheuserssystem./r/n",true);

  46. returnfalse;

  47. else

  48. --aversionlessthanversion2.0isinstalled

  49. --Outputtothelogfilethatalesserversionof.NETwasfoundonthesystem

  50. SetupData.WriteToLogFile("Info/t.NET2.0Module:Aneworthisversionof.NET2.0wasfoundontheuserssystem./r/n",true);

  51. returntrue;

  52. end

  53. end

  54. </ DetectScript >

  55. < DetectFunction > isDotNet_Installed </ DetectFunction >

  56. < InstallScript >

  57. --用在安装操作中的变量:

  58. localstrMessage=[[安装程序检测到你的系统没有安装Microsoft.NETFramework2.0或者版本过旧。请点击“确定”进行安装,点击“取消”中止安装。]];

  59. localstrDialogTitle="必需的技术文件";

  60. localbShowUserPrompt=true;--设置为true来询问用户是否安装模块

  61. localbRunInstallFile=true;--设置默认选择(是否默认运行安装)

  62. localstrRuntimeSupportFolder=SessionVar.Expand("%TempLaunchFolder%//dotnet2_0");

  63. localstrFileToRun=strRuntimeSupportFolder.."//dotnetfx.exe";

  64. -----------------------------------------------------------------------------------------

  65. --安装已启动。

  66. SetupData.WriteToLogFile("成功/tdotnet2_0模块:安装脚本已启动。/r/n",true);

  67. --删除临时文件和运行时支持文件夹(同时进行错误检查)

  68. localfunctionPerformCleanUp()

  69. File.Delete(strFileToRun);

  70. error=Application.GetLastError();

  71. iferror~=0then

  72. SetupData.WriteToLogFile("错误/tdotnet2_0模块:无法删除临时文件(".._tblErrorMessages[error]..")/r/n",true);

  73. end

  74. Folder.Delete(strRuntimeSupportFolder);

  75. error=Application.GetLastError();

  76. iferror~=0then

  77. SetupData.WriteToLogFile("错误/tdotnet2_0模块:无法删除临时文件夹(".._tblErrorMessages[error]..")/r/n",true);

  78. end

  79. end

  80. --是否显示对话框来询问用户是否安装模块。

  81. if(bShowUserPrompt)then

  82. localnDialogResult=Dialog.Message(strDialogTitle,strMessage,MB_OKCANCEL,MB_ICONEXCLAMATION);

  83. if(nDialogResult==IDOK)then

  84. --用户选择安装模块。

  85. bRunInstallFile=true;

  86. --用户要安装它

  87. SetupData.WriteToLogFile("成功/tdotnet2_0模块:用户已确认,准备安装。/r/n",true);

  88. else

  89. --用户不安装模块。

  90. bRunInstallFile=false;

  91. --用户回答否

  92. SetupData.WriteToLogFile("成功/tdotnet2_0模块:用户不安装模块。/r/n",true);

  93. end

  94. end

  95. --检查用户是否要安装运行时。

  96. if(bRunInstallFile)then

  97. --开始!

  98. SetupData.WriteToLogFile("成功/tdotnet2_0模块:正在运行dotnet2_0安装程序。/r/n",true);

  99. --“/R:N”命令行参数告诉VB安装程序若需要的话不要显示重启屏幕。

  100. --我们将检测整个安装进程返回代码,若需要的话,还设置内部_NeedsReboot变量。

  101. --【注意】在静默方式下,你不能添加命令行参数“/Q”来运行安装

  102. localnResult=File.Run(strFileToRun,"/R:N","",SW_SHOWNORMAL,true);

  103. if(nResult==3010)then

  104. --VB安装指明它需要重启才能完成

  105. --设置SetupFactory的重启变量,以便在安装结束时重启

  106. _NeedsReboot=true;

  107. --需要重启

  108. SetupData.WriteToLogFile("成功/tdotnet2_0模块:dotnet2_0安装程序已告知它需要重启。/r/n",true);

  109. end

  110. --删除运行时安装程序文件,并删除临时文件夹

  111. PerformCleanUp();

  112. --全部完成!

  113. SetupData.WriteToLogFile("成功/tdotnet2_0模块:dotnet2_0运行时安装完毕。/r/n",true);

  114. else

  115. --用户不想安装运行时,那么删除运行时安装程序文件,

  116. --并删除临时文件夹,然后退出安装程序。

  117. PerformCleanUp();

  118. --全部完成!

  119. SetupData.WriteToLogFile("成功/tdotnet2_0模块:dotnet2_0运行时未安装。/r/n",true);

  120. Application.Exit();

  121. end

  122. </ InstallScript >

  123. < SupportFiles >

  124. < File > #SUFDIR#/Dependencies/dotnet2_0/dotnetfx.exe </ File >

  125. </ SupportFiles >

  126. </ Dependency >

  127. </ DependencyTemplate >
复制代码


==========================================================================
制作安装程序,无非是复制文件、注册控件、注册服务、修改设置项(注册表、配置文件)等等。通过一些专门的安装制作软件不难做出一个专业的安装程序。

.net下的WinForm程序,制作安装包需要做些什么呢?
典型情况下可能需要做如下事情:

1、判断客户机是否安装了.net framework

2、复制程序文件

3、将某些控件加入到全局应用程序缓存(GAC),比如第三方的控件或是自己定义的具有强名称的控件

4、安装时的默认设置项,比如程序的配置文件、或修改注册表等

5、创建快捷方式、软件的卸载

制作安装程序的工具比较多,常见的比如InstallShield、Wise Install、以及VS本身自带安装程序制作功能,前2个都是专业级的安装制作工具,所以安装文件也是巨大。这里我们推荐一款制作安装程序的软件Setup factory7.0,使用这个软件能够轻松的制作出一个专业的安装程序,它内置一种跟VBS类似的脚本语言,通过编写action脚本,能够实现比较强大的一些,比如从网上下载一些需要的安装文件。

对于Setup factory7.0的一般性使用这里就不详细介绍了,自己稍微摸索一下就知道了。我只介绍一下关于如何判断是否安装了.net framework及自动下载框架的安装文件并安装、如何修改注册表项、自定义安装界面等。

1、如何判断是否安装了.net framework

这里是判断注册表中是否存在框架的注册项。需要在Setup factory中的工程-操作的OnStartup事件中写如下代码:
  1. -- 判断是否安装了.net框架
  2. hasInstalled = Registry.DoesKeyExist(HKEY_LOCAL_MACHINE, " Software/Microsoft/.NETFramework " );
  3. if hasInstalled == false then
  4. result = Dialog.Message( " 安装提示 " , " 运行本软件需要安装.Net框架1.1版,是否从网络中下载并安装? " ,MB_YESNO,MB_ICONQUESTION,MB_DEFBUTTON1)
  5. if result == IDYES then
  6. isExists = HTTP.TestConnection( " http://www.zhangyongjun.com/fdown/uploadfile/dotnetfx.exe " , 90 , 80 );
  7. if isExists == true then
  8. -- ShowtheStatusDlg
  9. StatusDlg.Show(MB_ICONINFORMATION, false );
  10. StatusDlg.ShowCancelButton( true , " 取消 " );

  11. -- Set statusdlgtitle and message
  12. StatusDlg.SetTitle( " 下载所需文件... " );
  13. -- Set meterrange(maxrange = 65534 )
  14. StatusDlg.SetMeterRange( 0 , 100 );
  15. -- Downloadafilefromtheinternet to theuser ' scomputer
  16. -- UsesDownloadCallback() as thecallback function
  17. HTTP.Download( " http://www.zhangyongjun.com/fdown/uploadfile/dotnetfx.exe " ,SessionVar.Expand( " %TempFolder%/dotnetfx.exe " ),MODE_BINARY, 20 , 80 ,nil,nil,DownloadCallback);

  18. -- HidetheStatusDlg
  19. StatusDlg.Hide();
  20. Shell.Execute(SessionVar.Expand( " %TempFolder%/dotnetfx.exe " ), " open " , "" , "" ,SW_SHOWNORMAL)
  21. else
  22. Dialog.Message( " 错误提示 " , " 下载文件失败,可能服务器已停止服务。请从Microsoft网站上下载.NetFramework1.1。 " ,MB_ICONEXCLAMATION);
  23. Application.Exit( 0 );
  24. end
  25. else
  26. Application.Exit( 0 );
  27. end
  28. end

  29. -- Callback function for HTTP.Download
  30. function DownloadCallback(nDownloaded,nTotal,TransferRate,SecondLeft,SecondsLeftFormat,Message)
  31. -- Converttotal and downloadedbytesintoformattedstrings
  32. sDownloaded = String .GetFormattedSize(nDownloaded,FMTSIZE_AUTOMATIC, true );
  33. sTotal = String .GetFormattedSize(nTotal,FMTSIZE_AUTOMATIC, true );
  34. -- Output time left ,formatted.
  35. StatusDlg.SetMessage( " 正在下载文件...剩余时间: " ..SecondsLeftFormat);
  36. -- Outputformattedsizes to userthroughstatusdlgstatustext
  37. StatusDlg.SetStatusText( " 已下载: " ..sDownloaded.. " / " ..sTotal);
  38. -- Set meterposition(fractiondownloaded * maxmeterrange)
  39. StatusDlg.SetMeterPos((nDownloaded / nTotal) * 100 );
  40. end
复制代码

2、操作注册表

在定制安装界面中,可以添加一个界面,选择界面类型,并且能够自定义界面上的操作事件,比如在OnPreload、OnNext、OnBack、OnCancel、OnHelp编写脚本以实现特定的功能,下面的代码是实现在自定义的配置设置界面中用户填写完配置信息后,点“下一步”时,将填写的信息写入到注册表,其中CTRL_EDIT_01等为编辑控件(这里是文本框)的ID。
  1. -- 这些操作在点击“下一步”按钮时执行。
  2. -- 提示:你可以在这里添加验证用户输入信息的操作
  3. Registry.CreateKey(HKEY_LOCAL_MACHINE, " Software/FengcheSoft/TradeSystem " );
  4. tEditFieldServer = DlgEditField.GetProperties(CTRL_EDIT_01);
  5. tEditFieldDBUser = DlgEditField.GetProperties(CTRL_EDIT_02);
  6. -- Debug.ShowWindow( true );

  7. Registry.SetValue(HKEY_LOCAL_MACHINE, " Software/FengcheSoft/TradeSystem " , " ServerName " ,tEditFieldServer.Text,REG_SZ);
  8. Registry.SetValue(HKEY_LOCAL_MACHINE, " Software/FengcheSoft/TradeSystem " , " DBUser " ,DlgEditField.GetProperties(CTRL_EDIT_02).Text,REG_SZ);
  9. Registry.SetValue(HKEY_LOCAL_MACHINE, " Software/FengcheSoft/TradeSystem " , " DBPwd " ,DlgEditField.GetProperties(CTRL_EDIT_03).Text,REG_SZ);
  10. Registry.SetValue(HKEY_LOCAL_MACHINE, " Software/FengcheSoft/TradeSystem " , " DBName " ,DlgEditField.GetProperties(CTRL_EDIT_04).Text,REG_SZ);

  11. Debug.Print(tEditFieldServer.Text);
  12. test = Registry.GetValue(HKEY_LOCAL_MACHINE, " Software/FengcheSoft/TradeSystem " , " ServerName " , true );
  13. Debug.Print(test);
  14. -- 进入下一个屏幕
  15. Screen.Next();
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-16 06:16 , Processed in 0.112297 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表