把.NET程序部署到没有安装.NET Framwork的机器上

摘要
本文讨论了如何使用Windows Installer技术发布.NET程序,以及如何使用native代码判断目标机器上是否安装有.NET Framework; 如果没有,将自动安装.NET Framework然后安装作者自己的.NET程序。

--------------------------------------------------------------------------------

目录
本文内容
制作自己的安装程序
发布.NET Framework
制作自己的native安装程序
使用方法
总结
作者

--------------------------------------------------------------------------------

本文内容
1. 使用VS.NET来制作安装程序。
2. 如何把.NET Framework 部署到目标机器。
3. 如何使用Native代码把.NET Framework和自己的安装程序制作为一个统一的安装程序。该程序做到如果目标机器上没有.NET Framework,将自动安装.NET Framework然后再自动安装作者自己的程序。

--------------------------------------------------------------------------------

制作自己的安装程序
在VS.NET中,我们可以通过建立"Setup and Deployment Projects"项目,非常灵活方便的把自己的.NET程序制作为Windows Installer文件。比如,我们可以很方便的定制下面这些选项:
1. 是否在桌面上放置快捷方式。
2. 注册自己的文件类型,可以通过双击该文件来使用自己的程序打开。
3. 注册表的处理
在下面的MSDN站点,我们可以获得在VS.NET中通过Setup and Deployment Projects来制作自己的安装程序的示例:
http://msdn.microsoft.com/library/en-us/vsintro7/html/vbconDeploymentScenarios.asp

--------------------------------------------------------------------------------

发布.NET Framework
.NET Framework 1.0提供一个用来重新部署.NET的exe文件:Dotnetfx.exe. 它包含了Common Language Runtime和其它.NET程序运行时必不可少的内容。
我们可以从下面的站点下载该exe文件:
http://msdn.microsoft.com/downloads/sample.asp?url=/MSDN-FILES/027/001/829/msdncompositedoc.xml
同时,我们也可以在VS.NET安装CD或者DVD中找到该文件。
我们可以通过多种方式来通过运行Dotnetfx.exe把.NET Framework部署到目标机器上:
1. 通过Microsoft Systems Management Server部署。
2. 通过Active Directory部署。
3. 使用第三方工具。
具体的信息,我们可以参阅下面的文章:
http://msdn.microsoft.com/library/en-us/dnnetdep/html/redistdeploy.asp

--------------------------------------------------------------------------------

制作自己的native安装程序
如果我们要把自己的.NET程序发布到目标机器上,同时我们不确定该目标机器是否已经安装了.NET Framework, 那我们就需要自己设计一段unmanaged代码,来判断目标机器是否安装了.NET Framework, 如果没有,则运行Dotnetfx.exe安装.NET Framework, 然后利用Windows Installer安装自己的程序。
在MSDN的下面网页上,我们可以获得一个使用unmanaged C++实现的安装程序和它的源代码:
http://msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/msdn-files/027/001/830/msdncompositedoc.xml
1. 在CSettings class中,通过读取"settings.ini",获得您自己的MSI安装文件和dotnetfx.exe的路径,以及其他您自己的设置。(比如.NET Framework的语言版本)
GetCaptionText(void)
GetDialogText(void)
GetErrorCaptionText(void)
GetIniName(void)
GetProductName(void)
Parse()函数用来解析settings.ini文件。
2. 在Main.cpp文件中,全局函数FxInstallRequired()判断是否要在目标机器上安装.NET Framework. FxInstallRequired()会检测下面的注册表键值和dotnetfx.exe的版本和语言设置。
HKLM\SOFTWARE\Microsoft\.NETFramework\policy\v1.0
3.如果需要安装.NET Framework, 在全局函数ExecCmd()中调用下面的命令silent安装dotnetfx.exe:
dotnetfx.exe /q:a /c:"install /l /q"
4。 在ExecCmd()全局函数中调用下面的命令安装您自己的MSI文件:
msiexec /i <your MSI file> REBOOT=ReallySuppress

--------------------------------------------------------------------------------

使用方法
如果我们使用上面的native代码作为自己的安装程序,那么我们可以通过下面的步骤把自己的.NET程序和它结合在一起:
1.把您自己的.NET程序制作成为Windows Installer (.MSI)文件。
2.打开"settings.ini"文件,在"Msi" key中设置您自己的.NET程序的MSI文件路径和文件名;在"FxInstallerPath" Key中,设置dotnetfx.exe的路径。具体的参数信息,您可以从下面文章中得到:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/redistdeploy.asp
3. 把"setup.exe", "settings.ini", "dotnetfx.exe"和您自己的MSI安装文件,发送到目标机器上,然后运行"setup.exe", 安装程序会自动检测是否有.NET Framwork, 如果没有,将首先运行dotnetfx.exe。
通过上述步骤,您可以将自己的.NET程序成功的部署到没有安装.NET Framwork环境的机器上。

--------------------------------------------------------------------------------

总结
通过上述步骤,您可以将自己的.NET程序成功的部署到没有安装.NET Framwork环境的机器上。

--------------------------------------------------------------------------------

作者
张广辉
2002年10月22日

转载于:https://www.cnblogs.com/cdo/archive/2005/06/15/174603.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双层玻璃窗的功效模型matlab,数学建模:双层玻璃窗的功效,80人%的人搞不懂数学的应用价值...

原标题&#xff1a; 数学建模&#xff1a;双层玻璃窗的功效&#xff0c;80人%的人搞不懂数学的应用价值A.Einstein有一句名言&#xff1a;想象力比知识更重要&#xff0c;因为知识是有限的&#xff0c;而想象力包括世界的一切&#xff0c;推动着进步&#xff0c;并且是知识的源…

Java LinkedList addLast()方法与示例

LinkedList addLast()方法 (LinkedList addLast() method) This method is available in package java.util.LinkedList. 软件包java.util.LinkedList中提供了此方法。 This method is used to insert an object at the last or ending stage of the linked list. 此方法用于在…

8086CPU物理地址

8086CPU有20位地址总线&#xff0c;可以传送20位地址&#xff0c;达到1MB寻址能力&#xff0c;但8086CPU内部是16位&#xff0c;表现出来的寻址能力只有64kb。 8086CPU采用一种在内部用用两个16位地址合成的方法来形成一个20位的物理地址。 CPU中的相关部件提供两个16位地址&a…

json php input,在php中读取json输入

php&#xff1a;//输入在localhost中正常工作.但在服务器中它返回空.输入(请求)到我的站点是一个json(REST – 应用程序/ json类型),所以$_POST不起作用(请阅读This question).$_POST works with key-value pair type inputs like form-data or x-www-urlencodedkey1value1&…

8086的CS段寄存器(IP)

8086共有四个段寄存器&#xff0c;分别为CS&#xff0c;DS&#xff0c;SS&#xff0c;ES CS为代码段寄存器&#xff0c;还有个与CS息息相关的寄存器叫IP&#xff0c;为指令指针寄存器。 在8086PC机中&#xff0c;设CS中的内容为M&#xff0c;IP的内容为N&#xff0c;8086CPU将从…

array_reverse_PHP array_reverse()函数与示例

array_reversePHP array_reverse()函数 (PHP array_reverse() function) array_reverse() function is used to returns an array in reverse order, it accepts an array and returns a new array with values in reverse order. array_reverse()函数用于以相反的顺序返回数组…

hibernate中PO对象的三种状态分析以及session中的一些方法的区别

hibernate的状态 hibernate的各种保存方式的区(save,persist,update,saveOrUpdte,merge,flush,lock)及 对象的三种状态 hibernate的保存 hibernate对于对象的保存提供了太多的方法&#xff0c;他们之间有很多不同&#xff0c;这里细说一下&#xff0c;以便区别。 一、预备知识 …

思绪飞扬(一)

喜欢一个呆在房间了&#xff0c;听着音乐&#xff0c;冲一杯香甜的牛奶。任自已的思绪在空气中放飞&#xff01;似乎这一刻天地之间只有自已。 想想自已已经历了人生的近三分之一的时光。回首之间&#xff0c;二十几年的时间&#xff0c;我们经历了很多事&#xff0c;有…

nginx php fpm 日志,nginx下php-fpm不记录php报错日志怎么办?

解决nginx下php-fpm不记录php报错日志的办法&#xff1a;1、修改【php-fpm.conf】中配置&#xff0c;没有则增加&#xff1b;2、修改【php.ini】中配置&#xff0c;没有则增加&#xff1b;3、重启【php-fpm】即可。解决nginx下php-fpm不记录php报错日志的办法:1.修改php-fpm.co…

jmp、JE、JZ、JNE、JNT指令

JMP JMP 指令无条件跳转到目标地址&#xff0c;该地址用代码标号来标识&#xff0c;并被汇编器转换为偏移量 格式&#xff1a; JMP destination当 CPU 执行一个无条件转移时&#xff0c;目标地址的偏移量被送入指令指针寄存器&#xff0c;从而导致迈从新地址开始继续执行。 …

ruby hash方法_Ruby中带有示例的Hash.length方法

ruby hash方法哈希长度方法 (Hash.length Method) In this article, we will study about Hash.length Method. The working of this method can be predicted with the help of its name but it is not as simple as it seems. Well, we will understand this method with the…

【转贴备忘】[教程]iPhone 實機開發 Part 1 - HelloWorld

http://bbs.weiphone.com/read-htm-tid-222380-page-1.html最近小弟開始在研究 iPhone 的開發,無奈找到的資料都是舊的,也不知道怎麼放到 iPhone 上,應該很多人都跟我有同樣的困擾吧!經過幾天的研究總算寫出第一個 HelloWorld,而且可以不用付99元美金就可以放到實機上執行! 今天…

final 在java,final 在java中的注意点

注意事项慢慢积累final 类不可被继承&#xff0c;也不能有子类。final class Book{}//class ComBook extends Book{} 这将编译失败&#xff0c;因为Book类不可被继承。final方法不可被改写class Book{final void show(){System.out.println("Book的show()方法”)&…

ECC加密算法入门介绍

前言 同RSA&#xff08;Ron Rivest&#xff0c;Adi Shamir&#xff0c;Len Adleman三位天才的名字&#xff09;一样&#xff0c;ECC&#xff08;Elliptic Curves Cryptography&#xff0c;椭圆曲线密码编码学&#xff09;也属于公开密钥算法。目前&#xff0c;国内详细介绍E…

DS和[address]

8086CPU中&#xff0c;用16位寄存器来存储一个字。高8位存放高位字节&#xff0c;低8位存放低位字节。在内存中存储时&#xff0c;由于内存单元是字节单元&#xff0c;则一个字要用两个地址连续的内存单元来存放&#xff0c;这个字的低位存放低地址单元中&#xff0c;高位字节存…

计算机指令格式_计算机科学组织| 指令格式

计算机指令格式指令格式 (Instruction format ) Instruction format describes the internal structures (layout design) of the bits of an instruction, in terms of its constituent parts. 指令格式按照指令的组成部分描述指令位的内部结构(布局设计)。 An Instruction fo…

对JSON的一点认识和理解以及JQuery处理JSON

JSON(JavaScript Object Notation)javscript对象标记&#xff0c;是一种轻量级的数据交换格式。具体的详细基础知识可以参考JSON官网http:/www.json.org/。 不说太多废话&#xff0c;直接说说我对JSON的理解吧。 一、JSON的一些基础知识。 JSON中对象通过“{}”来标识&#xff…

网络硬盘

不知道自己确切从何时对各种IT玩意儿开始极其关注的&#xff0c;我以前不是这样&#xff0c;至少在大学时不是这样&#xff0c;虽然是学计算机的。但现在总是喜欢尝试这些东西&#xff0c;今天试了试Mofile&#xff0c;一个网络硬盘&#xff0c;看起来不错的样子&#xff0c;且…

SUB指令

形式&#xff1a; SUB dest, source功能&#xff1a; 从目的操作数中减去源操作数 .data var1 DWORD 30000h var2 DWORD 10000h .code mov eax,var1 ;EAX 30000h sub eax,var2 ;EAX 20000h几种形式&#xff1a; sub 寄存器&#xff0c;数据 比…

php 查看 实例 的方法,php – 从Laravel 5.1中的通用数据库查询中获取Eloquent模型的实例...

我有不同关系的模型.假设我的Entry模型属于供应商,所以通常我的模型文件中有一个supplier()方法.到目前为止一切都那么好,当我有一些像Entry :: find(1) – >供应商这样的产品时,效果非常好.然而,什么是无效的是当我从Laravel中的通用DB ::查询中获取条目时,我显然无法访问s…