安装net

net  时间:2021-03-02  阅读:()
收稿日期:2003-08-08;修返日期:2003-09-22.
NET智能安装包的构想与实现周艳芳,庄成三,刘丽丽(四川大学计算机系,四川成都610065)摘要:针对.
NET应用的部署问题,在.
NET自身提供的部署工具的基础上,提出了一些智能化的部署构想与实现方法,包括自动检测和安装Dotnetfx.
exe,Mdac组件,自动恢复数据库,采用配置文件来连接数据库,以及在安装时自动更新配置文件,极大地减轻了用户的工作.
关键词:智能安装包;部署;.
NET中图法分类号:TP311文献标识码:A文章编号:1001-3695(2004)07-0066-04DesignandRealizationofanIntelligent.
NETReleasePackageZHOUYan-fang,ZHUANGCheng-san,LIULi-li(Dept.
ofComputer,SichuanUniversity,ChengduSichuan610065,China)Abstract:Focusingontheproblemsofthereleaseofthe.
NETapplication,providesasolutionforreleasinga.
NETapplica-tionautomatically.
ThisincludesinspectingandinstallingDotnetfx.
exeandMdac_type.
execomponent,restoringdatabaseau-tomatically,usingaconfigurationfiletoconstructaconnectiontoadatabaseandmodifytheconfigurationfilewhileinstallingthesoftwareusingtheinformationtheuserinput.
Bythismeans,theworktheuserneedtodocanbereducedbyalargedegree.
Keywords:IntelligentReleasePackage;Release;.
NET0引言.
NET是微软公司最近推出的新的软件开发平台,综合体现了软件技术的最新发展.
.
NET平台彻底改变了微软的软件开发的技术和方法.
.
NET框架适用于开发Web应用和Win-dows应用.
与COM+仅在形式上将开发这两类不同应用的不同环境的工具绑在一起不同,.
NET框架中可用同一种语言(如C#),用同一套支持类库,即.
NET框架类库开发Web应用和Windows应用这两类不同应用.
而且,.
NET框架中可用的任何语言,无论C#,VB和JScript都用同一套支持类库.
.
NET框架简化了在高度分布式的Web环境中的应用程序开发,提供一个一致的分布式的面向对象的编程环境,设计出的对象代码可在本地存储和执行,也可在本地执行但代码在Internet上分布,或是在本地存储代码在远程执行.
.
NET框架提供的WebForms等类(Class)使软件开发人员能像开发Windows应用一样开发Web应用.
.
NET框架中嵌入网页的代码是编译后执行,消除了脚本解释环境引起的性能问题.
针对互联网安全的要求,.
NET框架提供一个保证安全执行代码的.
NET框架的执行环境.
与COM+相比,.
NET框架解决了DLL版本冲突引起的问题,提供了版本冲突最小化的代码执行环境.
迄今为止,一些公司已经开始在.
NET平台上开发应用软件.
而且,.
NET一个非常突出的特征就是其安装可以通过使用简单的Xcopy来完成.
装配件仅仅包含许多文件,不再需要注册表来存储装配件配置,因此对多个文件进行复制可以完成安装.
但是,很快就可以知道,有一些原因导致不能完成Win-dows应用程序的安装而使用Xcopy.
对于部署Windows应用程序来说,Xcopy仅可以用于最简单的应用程序;对于仅仅安装在少数系统中的应用程序而言,Xcopy可以完成许多工作;但对于大型应用系统或安装在许多系统中的应用程序而言,我们就需要考虑一种更好的安装机制.
Xcopy不注册或验证装配件的位置,它也不能使用WindowsInstallerZeroAdministra-tionWindows(ZAW)功能,这就意味着文件可以随意被重写,而且也没有内置的卸载程序.
针对这个问题,本文提出了关于构建一个.
NET智能安装包的构想和实现方法.
1.
NET智能安装包的构想可以说.
NET开发环境为我们提供了从开发到部署的一整套解决方案,但是还有一些需要解决的问题.
.
NET应用程序的运行需要CLR的支持,但是现在的操作系统如Win98,Win2000都没有集成CLR,所以需要单独安装.
而且应用程序一旦涉及到对数据库的访问,就要求计算机安装MDAC(微软数据访问组件).
还有初次安装的时候,一般都会涉及到数据库的恢复.
这么多需要解决的问题,对于普通用户而言,是比较麻烦的,不一定都能够胜任.
那么就可以想象到,用.
NET开发的应用程序,如果不采取某种措施来简化应用程序的部署,就可能加重公司技术支持的工作.
本文就是对.
NET应用程序的部署进行了进一步的探讨,制作一个自己的Native安装程序,使安装包具有一定的智能,从而简化用户需要完成的工作.
我们构建的智能安装包可以按照工作流程(图1)自动完成所有的工作.
·66·计算机应用研究2004年图1智能安装包的工作流程图2智能安装包构想的实现2.
1打包应用程序对于制作安装程序,VisualStudio.
NET提供了很方便的解决办法:可以在集成开发环境中为您的解决方案添加一个安装程序项目,如果是Windows安装项目,可以选择安装向导或者安装项目;如果是Web应用,可以选择安装向导或者Web安装项目,并选择把这个项目添加到解决方案.
然后您可以在Vis-ualStudio.
NETSetupProject可视化的视窗中,很方便地完成安装程序的设置.
我们可以得到六个编辑器:①FileSystem编辑器用于安装软件包中添加文件;②通过使用Registry编辑器,可以为应用程序创建注册表项;③FileTypes编辑器允许注册应用程序的具体文件扩展名;④通过使用UserInterface编辑器,可以添加和配置对话框,在安装程序期间显示这些对话框;⑤CustomActions编辑器允许它在安装和卸载期间启动定制的程序;⑥通过使用LaunchCondition编辑器,可以归档对应用程序的要求,比如必须具有.
NET时.
您只需要编译这个解决方案的所有项目,就可以生成WindowInstaller类型的应用程序安装包.
WindowsInstaller(Windows安装程序)具有如下优点:安装时,用户可以选择要安装的功能.
通过使用通知(Advertisement),也可以在首次需要使用功能时再安装它.
如果安装失败,则回滚(Rollback),这样系统就可以返回到安装之前的状态;如果文件损坏,则可以很容易地修复应用程序(即仅仅重新安装损坏的组件).
在Windows安装程序文件中,我们可以读取如下的信息:安装什么文件,完成什么样的注册表配置;应用程序可以完全卸载.
2.
2自动安装.
NETFramework和Mdac如果我们要把自己的.
NET程序发布到目标机器上,同时我们不确定该目标机器是否已经安装了.
NETFramework,那就需要自己设计一段Unmanaged代码,来判断目标机器是否安装了.
NETFramework.
如果没有,则运行Dotnetfx.
exe安装.
NETFramework.
如果应用程序涉及到对数据库的访问,同时我们不确定目标机器上是否已经安装了需要的合适版本的Mdac,那么需要用自己设计的Unmanaged代码,来判断目标机器是否安装了Mdac,如果没有,则运行Mdac_type.
exe安装Mdac,然后利用WindowsInstaller安装自己的程序.
具体实现如下:(1)在CSettingsClass中,通过读取"settings.
ini",获得您自己的MSI安装文件和Dotnetfx.
exe的路径,以及其他您自己的设置(如.
NETFramework的语言版本).
GetCaptionText(void)GetDialogText(void)GetErrorCaptionText(void)GetIniName(void)GetProductName(void)Parse()函数用来解析settings.
ini文件(2)在Main.
cpp文件中,全局函数FxInstallRequired()判断是否要在目标机器上安装.
NETFramework.
FxInstall-Required()会检测下面的注册表键值和Dotnetfx.
exe的版本和语言设置:HKLM\=SOFTWARE=Microsoft\.
NETFramework\policy\v1.
0代码如下:BOOLFxInstallRequired(){BOOLbResult=TRUE;TCHARszFxInstaller[MAX_PATH+LENGTH(g_tszFxInstaller)];//buildfully-qualifiedpathtodotnetfx.
exe_sntprintf(szFxInstaller,LENGTH(szFxInstaller)-1,_T("%s%s"),g_settings.
GetFxInstallerPath(),g_tszFxInstaller);try{HRESULThr;VS_FIXEDFILEINFOvsf;hr=GetFileVersion(szFxInstaller,&vsf);if(FAILED(hr)){throwhr;}//retrievedotnetfx.
exebuild#DWORDdwFileVersionLS=vsf.
dwFileVersionLS>>16;//weneedatextrepresentationTCHARszVersion[11];//sufficientforDWORDmax+zeroterm_stprintf(szVersion,_T("%u"),dwFileVersionLS);//nowwe′llchecktheregistryforthisvalueLONGlResult;HKEYhkey=NULL;lResult=RegOpenKeyEx(HKEY_LOCAL_MACHINE,g_tszFxRegKey,NULL,KEY_READ,&hkey);//wedon′tproceedunlessthecallabovesucceedsif(ERROR_SUCCESS!
=lResult&&ERROR_FILE_NOT_FOUND!
=lResult){throwHRESULT_FROM_WIN32(lResult);}if(ERROR_SUCCESS==lResult){TCHARszPolicy[256];DWORDdwBufLen=LENGTH(szPolicy);lResult=RegQueryValueEx(hkey,szVersion,NULL,NULL,(LP-BYTE)szPolicy,&dwBufLen);if(ERROR_SUCCESS==lResult){//keyfound,nowweneedtocheckfortheexistenceof//theappropriatelanguageinstalldir.
TCHARszLanguageDir[512];if(!
GetWindowsDirectory(szLanguageDir,LENGTH(szLan-guageDir))){throwHRESULT_FROM_WIN32(GetLastError());}StrCatBuff(szLanguageDir,_T("\Microsoft.
NET\Framework\v1.
0.
"),LENGTH(szLanguageDir));StrCatBuff(szLanguageDir,szVersion,LENGTH(szLanguage-Dir));StrCatBuff(szLanguageDir,_T(LENGTH(szLanguage-Dir));StrCatBuff(szLanguageDir,g_settings.
GetLanguageDirectory(),LENGTH(szLanguageDir));DWORDdwResult=GetFileAttributes(szLanguageDir);if(dwResult!
=INVALID_FILE_ATTRIBUTES&&(dwResult&FILE_ATTRIBUTE_DIRECTORY)){//wefoundoursubdirectory,noneedtoinstallbResult=FALSE;}}·76·第7期周艳芳等:.
NET智能安装包的构想与实现自动检测和安装D燥贼灶藻贼枣曾援藻曾藻自动修改配置文件数据库连接字符串自动检测和安装M葬凿c自动恢复数据库安装应用程序包//ifwereceiveanerrorotherthan0x2,throwelseif(ERROR_FILE_NOT_FOUND!
=lResult){RegCloseKey(hkey);throwHRESULT_FROM_WIN32(lResult);}RegCloseKey(hkey);}}catch(HRESULThr){CErrorse;se.
ShowHResultMessage(IDS_VERSION_DETECT_FAILED,0,MB_OK,hr,szFxInstaller);throwhr;}returnbResult;}(3)如果需要安装.
NETFramework,在全局函数Exec-Cmd()中调用下面的命令Silent安装Dotnetfx.
exe:dotnetfx.
exe/q:a/c:"install/l/q"DWORDExecCmd(LPCTSTRpszCmd){BOOLbReturnVal=false;STARTUPINFOsi;DWORDdwExitCode;SECURITY_ATTRIBUTESsaProcess,saThread;PROCESS_INFORMATIONprocess_info;ZeroMemory(&si,sizeof(si));si.
cb=sizeof(si);saProcess.
nLength=sizeof(saProcess);saProcess.
lpSecurityDescriptor=NULL;saProcess.
bInheritHandle=TRUE;saThread.
nLength=sizeof(saThread);saThread.
lpSecurityDescriptor=NULL;saThread.
bInheritHandle=FALSE;bReturnVal=CreateProcess(NULL,(LPTSTR)pszCmd,&saProcess,&saThread,FALSE,DETACHED_PROCESS,NULL,NULL,&si,&process_info);if(bReturnVal){CloseHandle(process_info.
hThread);WaitForSingleObject(process_info.
hProcess,INFINITE);GetExitCodeProcess(process_info.
hProcess,&dwExitCode);CloseHandle(process_info.
hProcess);}else{CErrorse(IDS_CREATE_PROCESS_FAILURE,0,MB_ICON-ERROR,COR_EXIT_FAILURE,pszCmd);throw(se);}returndwExitCode;}(4)全局函数MdacInstallRequired()判断是否要在目标机器上安装.
NETFramework.
MdacInstallRequired()会检测下面的注册表键值:HKLM\=SOFTWARE\=Microsoft\=DataAccess\=FullInstallVerHKLM\=SOFTWARE\=Microsoft\=DataAccess\=Full21Install(5)如果需要安装Mdac,在全局函数ExecCmd()中调用下面的命令Silent安装Mdac_type.
exe:mdac_type.
exe/q:a/c:"install/l/q"MdacInstallRequired()和FxInstallRequired()的代码基本相同,限于篇幅,这里从略.
(6)在ExecCmd()全局函数中调用下面的命令安装您自己的MSI文件:msiexec/iREBOOT=ReallySuppress如果我们使用上面的Native代码作为自己的安装程序,那么可以通过下面的步骤把自己的.
NET程序与它结合在一起:①把您自己的.
NET程序制作成WindowsInstaller(.
MSI)文件.
②打开"settings.
ini"文件,在"Msi"key中设置您自己的.
NET程序的MSI文件路径和文件名;在"FxInstallerPath"Key中,设置Dotnetfx.
exe的路径;在"MdacInstallerPath"Key中,设置Mdac_type.
exe的路径.
③把"setup.
exe","settings.
ini","dotnetfx.
exe","mdac_type.
exe"和您自己的MSI安装文件发送到目标机器上,然后运行"setup.
exe",安装程序会自动检测是否有.
NETFram-work,如果没有,将首先运行Dotnetfx.
exe,接着将自动检测是否有Mdac,如果没有,将运行Mdac_type.
exe,最后运行MSI安装文件.
通过上述步骤,您可以将自己的.
NET程序成功地部署到没有安装Mdac和.
NETFramwork环境的机器上.
2.
3自动恢复数据库通过编写Native代码,我们解决了Dotnetfxsdk.
exe和Mdac_type.
exe的自动安装问题.
恢复数据库的问题,我们可以在.
NET集成开发环境中通过向解决方案添加一个安装程序类和安装项目完成.
在这里,我们利用了.
NET提供的反射机制和数据库访问组件ADO.
NET,您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型;然后,可以调用类型的方法或访问其字段和属性.
我们通过反射获得正在执行的Assembly,并获取恢复数据库需要执行的Sql语句.
为了避免误操作覆盖用户以前的数据库,我们可以检测一下目标机器上是否已经有了一个同名的数据库,如果没有才执行恢复数据库的工作.
通过覆盖In-staller类的Install方法,我们可以从安装环境获取用户输入的数据库服务器名、数据库名、用户名和密码,执行恢复数据库的语句.
我们需要从安装环境获取关于数据库的信息,所以在安装项目中,需要添加对话框,让用户输入这些信息.
并且将安装程序类添加的主输出也添加到安装项目中,修改其CustomAc-tiveData属性,将对话框中输入的内容与Context的Parameters参数对应起来,使之可以在安装程序中被访问.
更进一步,我们可以在应用程序中通过从App.
config或者Web.
config中获取信息来建立到数据库的连接.
这样,当修改数据库连接时,就只需要修改这两个文件,而不需要修改应用程序,不必重新编译应用程序.
我们可以在安装程序类中获取用户输入的数据库连接信息,在恢复数据库的同时,修改对应的配置文件,这样就不需要手动修改数据库配置文件.
publicoverridevoidInstall(System.
Collections.
IDictionarystateSaver){base.
Install(stateSaver);Console.
Write("Nowischeckingforthedatabaseyouspeci-fied!
");stringstrSql=GetSql("sql.
txt");strSql=strSql.
Replace("dbname",this.
Context.
Parameters["dbname"]);intexists=IsDataBaseExists(strSql);if(exists==0){trSql=GetSql("sql2.
txt");strSql=strSql.
Replace("dbname",this.
Context.
Parameters["dbname"]);RestoreDataBase(strSql);·86·计算机应用研究2004年}WriteWebConfig();}其中,GetSql()是从嵌入的资源文件中读取需要执行的Sql语句,IsDataBaseExists()是检查同名的数据库是否存在,Restore-DataBase()是恢复数据库,WriteWebConfig()是改写配置文件.
如果Web.
config中有如下的节:则可以通过下面的代码来初始化数据库的连接串:protectedvoidApplication_Start(Objectsender,EventArgse){stringstrDataSrc=ConfigurationSettings.
AppSettings["Data-Source"];stringstrDatabase=ConfigurationSettings.
AppSettings["Data-base"];stringstrUserId=ConfigurationSettings.
AppSettings["UserId"];stringstrPwd=ConfigurationSettings.
AppSettings["Password"];stringstrConn="provider=SQLOLEDB.
1;datasource="+str-DataSrc+";initialcatalog="+strDatabase+";uid="+strUserId+";pwd="+strPwdApplication["ConnString"]=strConn;}3结束语在.
NET逐渐火热的今天,如何简化在这个平台上开发的应用程序的部署,理所当然也是一个值得思考的问题.
本文就这个问题进行了一些有益的探索,让安装包具有一定的智能,能够自动检测目标机器上是否安装了.
NETFramework和Mdac,如果没有安装,则自动安装.
同时利用.
NET自身提供的功能,实现在安装应用程序的同时自动恢复数据库.
在某公司的项目中,采用了这种方式来发布应用程序,大大简化了用户的工作.
还有待探索的问题就是,有些数据库为了安全性的需要,不允许远程恢复数据库(也就是说被恢复的数据库备份文件必须位于本机器),所以当数据库服务器和应用服务器不在同一台机器的时候,恢复数据库可能会失败.
参考文献:[1]arliWatson,MatthewReynolds,etal.
BeginningC#[M].
康博.
北京:清华大学出版社,2002.
445-471.
[2]AlexHomer,DavidSussman,etal.
ProfessionalASP.
NET1.
0SpecialEdition[M].
王毅,杨浩,等,北京:清华大学出版社,2002.
580-581.
[3]Wyhw.
用VS.
NET制作安装程序(1)[EB/OL].
http://www.
as-px.
cn/article/go.
aspid=292&typeid=3,2003-05-05.
[4]张广辉.
把.
NET程序部署到没有安装.
NETFramework的机器上[EB/OL].
http://www.
aspcool.
com/lanmu/browsel.
aspID=995&bbuser=csharp,2002-12-04.
[5]icrosoftKnowledgeBaseArticle-257604:InstallDCOMandMDACThroughaWindowsInstallerPackage[EB/OL].
http://support.
mi-crosoft.
com/default.
aspxscid=http://support.
microsoft.
com:80/support/kb/articles/q257/6/04/asp&NOWebContent=1,2003-06-04.
作者简介:周艳芳(1979-),女(土家族),湖北恩施人,硕士研究生,主要研究方向为数据库与信息系统及管理;庄成三(1944-),男,四川人,教授,硕士生导师,主要研究方向为数据库与信息系统及管理;刘丽丽(1978-),女,四川成都人,硕士研究生,主要研究方向为数据库与信息系统及管理.
(上接第65页)(1)GBT也是一种平衡树.
在叶节点中存储一对序偶(关键字Ki,元组标志符TID).
(2)GBT至少应带有两个参数:KT和OP.
KT表示关键字的数据类型,可以是用户定义的任一种数据类型.
OP表示一个逻辑上的与新数据类型相匹配的比较谓词,而不是传统的B树中的比较谓词"NET智能安装包的构想与实现

易探云月付18元起,香港/美国/深圳/北京VPS,CN2、BGP等多线路

易探云怎么样?易探云是国内一家云计算服务商家,致力香港服务器、国内外服务器租用及托管等互联网业务,目前主要地区为运作香港BGP、香港CN2、广东、北京、深圳等地区。易探云服务器均选择当下热门线路,比如CN2 GIA、BGP线路、CN2线路等,所有云主机支持月付,并且首月优惠,年付优惠,优惠后香港沙田云服务器/独立ip/香港CN2线路,每月仅18元,188元/年。点击进入:易探云官方网站地址1、香港...

80VPS:香港服务器月付420元;美国CN2 GIA独服月付650元;香港/日本/韩国/美国多IP站群服务器750元/月

80vps怎么样?80vps最近新上了香港服务器、美国cn2服务器,以及香港/日本/韩国/美国多ip站群服务器。80vps之前推荐的都是VPS主机内容,其实80VPS也有独立服务器业务,分布在中国香港、欧美、韩国、日本、美国等地区,可选CN2或直连优化线路。如80VPS香港独立服务器最低月付420元,美国CN2 GIA独服月付650元起,中国香港、日本、韩国、美国洛杉矶多IP站群服务器750元/月...

易探云2核2G5M仅330元/年起,国内挂机宝云服务器,独立ip

易探云怎么样?易探云是国内一家云计算服务商家,致力香港服务器、国内外服务器租用及托管等互联网业务,目前主要地区为运作香港BGP、香港CN2、广东、北京、深圳等地区。目前,易探云推出深圳或北京地区的适合挂机和建站的云服务器,国内挂机宝云服务器(可选深圳或北京地区),独立ip;2核2G5M挂机云服务器仅330元/年起!点击进入:易探云官方网站地址易探云国内挂机宝云服务器推荐:1、国内入门型挂机云服务器...

net为你推荐
在线漏洞检测如何查看网站的漏洞?显卡温度多少正常显卡温度多少正常iphone越狱后怎么恢复苹果手机越狱之后能恢复原来吗?奇虎论坛奇虎论坛最新推荐歌曲列表·idc前线钢铁雄心2修改器srv记录SRV记录的定义qq等级表QQ等级列表去鼠标加速度CS去鼠标加速度和鼠标灵敏度的区别?请客网如何邀请客户吃饭qq新闻弹窗QQ弹出新闻
过期域名 申请免费域名 westhost 加勒比群岛 hawkhost 256m内存 光棍节日志 新站长网 双线主机 赞助 nerds 免费高速空间 网通服务器托管 台湾谷歌 上海联通宽带测速 服务器硬件防火墙 中国电信网络测速 个人免费邮箱 卡巴斯基官网下载 上海联通 更多