精华内容
下载资源
问答
  • winform 打包工具 生成程序安装
  • WinForm打包时卸载程序

    2012-05-11 10:03:20
    WinForm打包时卸载程序,包括32位和64位,打包必备
  • vs2010打包winform安装程序 ,快速实现程序安装部署。
  • 演练演示为启动记事本的 Windows 应用程序创建一个安装程序的过程。在本演练中,您将首先创建一个 Windows 应用程序,然后创建一个安装程序;以便在安装过程中设置快捷方式和文件关联、添加注册表项、显示自定义...

    演练演示为启动记事本的 Windows 应用程序创建一个安装程序的过程。在本演练中,您将首先创建一个 Windows 应用程序,然后创建一个安装程序;以便在安装过程中设置快捷方式和文件关联、添加注册表项、显示自定义对话框以及检查 Internet Explorer 的版本。 注意 创建自己的安装程序时,不一定需要执行下面的所有步骤。本演练的目的是介绍部署中可能会用到的一些可选功能。若只是创建一个基本的安装程序,则只需完成此过程中的前四个部分。 创建 Windows 应用程序 在“文件”菜单上指向“新建”,然后选择“项目”。 在“新建项目”对话框中,选择“项目类型”窗格中的“Visual Basic 项目”,然后选择“模板”窗格中的“Windows 应用程序”。在“名称”框中,键入“我的记事本”。 单击“确定”关闭对话框。 项目即被添加到解决方案资源管理器中,并且打开 Windows 窗体设计器。 在“工具箱”中选择“Windows 窗体”选项卡,并将“按钮”控件拖到窗体中。 双击 Button 控件为该按钮添加事件处理程序。在事件处理程序中添加下面的代码: Shell( "Notepad.exe ", AppWinStyle.NormalFocus) 这将启动 Notepad.exe 并将焦点对准它。 在“生成”菜单上,选择“生成我的记事本”该应用程序。 创建部署项目 在“文件”菜单上指向“添加项目”,然后选择“新建项目”。 在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“安装项目”。在“名称”框中,键入“我的记事本安装程序”。 单击“确定”关闭对话框。 项目被添加到解决方案资源管理器中,并且文件系统编辑器打开。 在解决方案资源管理器中选择“我的记事本安装程序”项目。在“属性”窗口中,选择 ProductName 属性,并键入“我的记事本”。 注意 ProductName 属性确定文件夹名称和“添加/删除程序”对话框中为应用程序显示的名称。 将 Windows 应用程序添加到安装程序中 在解决方案资源管理器中选择“我的记事本安装程序”项目。在“文件系统编辑器”中,选择“应用程序文件夹”节点。 在“操作”菜单上,选择“添加”-> “项目输出”。 在“添加项目输出组”对话框中,从“项目”下拉列表中选择“我的记事本”。单击“确定”关闭对话框。 从列表中选择“主输出”组,并单击“确定”。 在“生成”菜单上选择“生成我的记事本安装程序”。 部署应用程序(基本安装程序) 如果正在执行一个完整的演练过程,可以跳过此步骤。 在解决方案资源管理器中选择“我的记事本安装程序”项目。在“项目”菜单上选择“安装”。 这将运行安装程序并在开发计算机上安装“我的记事本”。 注意 必须在计算机上具有安装权限才能运行安装程序。 可选的部署功能 其余步骤演示可选的部署功能。 创建快捷方式 此步骤将为您的应用程序创建一个快捷方式,安装过程中,该快捷方式将放置到目标计算机的桌面上。 为 Windows 应用程序创建快捷方式 在解决方案资源管理器中选择“我的记事本安装程序”项目。 在“文件系统编辑器”中,选择“主输出来自‘我的记事本’”节点。 在“操作”菜单上,选择“创建主输出来自‘我的记事本’的快捷方式”。 这将添加一个“主输出来自‘我的记事本’的快捷方式”节点。 将此快捷方式重命名为“我的记事本的快捷方式”。 选择“我的记事本的快捷方式”,并将其拖到左窗格的“用户桌面”文件夹中。 创建文件关联 此步骤为“我的记事本”添加文件关联,以便双击 .vbn 文件时启动“我的记事本”应用程序。 为 Windows 应用程序创建文件关联 在解决方案资源管理器中选择“我的记事本安装程序”项目。在“视图”菜单上指向“编辑器”,然后选择“文件类型”。 在“文件类型编辑器”中选择“目标计算机上的文件类型”节点。在“操作”菜单上,选择“添加文件类型”。 将添加一个“新文档类型 #1”节点,而且该节点将打开,以便您重命名。 将“新文档类型 #1”重命名为 Vbn.doc。 在“属性”窗口中,将文件类型的 Extension 属性设置为 vbn。 选择 Command 属性并单击“省略号”() 按钮。在“选择项目中的项”对话框中,定位到“应用程序文件夹”,并选择“主输出来自‘我的记事本’”。 单击“确定”关闭对话框。 添加注册表项 此步骤将一个注册表项以及相应的值添加到注册表中。运行时,可以从应用程序代码中引用此注册表项以检索每用户信息。 为 Windows 应用程序添加注册表项 在解决方案资源管理器中选择“我的记事本安装程序”项目。在“视图”菜单上,指向“编辑器”,并选择“注册表”。 选择“HKEY_CURRENT_USER”节点并将其展开,然后展开“Software”节点,并选择“[Manufacturer]”节点。 注意 “Manufacturer”节点两边有括号,表示它是一个属性。它将被替换为输入的部署项目的 Manufacturer 属性值。 在“操作”菜单上,选择“新建”-> “项”。 重命名 UserChoice 项。 选择 UserChoice 项。 在“操作”菜单上,指向“新建”,然后单击“字符串值”。 重命名 TextColor 值。 在“属性”窗口中,选择 Value 属性,并输入 Black。 添加自定义安装对话框 此步骤添加并配置一个在安装期间显示的自定义用户界面对话框。 添加自定义安装对话框 在解决方案资源管理器中选择“我的记事本安装程序”项目。在“视图”菜单上指向“编辑器”,然后选择“用户界面”。 在用户界面编辑器中,选择“安装”节点下的“启动”节点。 在“操作”菜单上,选择“添加对话框”。 在“添加对话框”对话框中,选择“复选框 (A)”。 单击“确定”关闭对话框。 在“操作”菜单上,选择“上移”两次,将“复选框 (A)”对话框放置在“安装文件夹”对话框之上。 在“属性”窗口中,将 BannerText 属性设置为“示例”。 将 BodyText 属性设置为“‘安装示例文件’复选框控制是否安装示例文件。如果处于未选中状态,则不安装示例。 将 CheckBox1Label 属性设置为“要安装示例吗?”。 将 Checkbox2Visible、Checkbox3Visible 和 Checkbox4Visible 属性设置为 false。这将隐藏其他复选框。 使用示例 此步骤创建一个 Samples 子文件夹,它将被安装到 Application 文件夹的下面。

    添加 Samples 文件夹

    在解决方案资源管理器中选择“我的记事本安装程序”项目。在“视图”菜单上指向“编辑器”,然后选择“文件系统”。“应用程序文件夹”仍应被选中。
    从“操作”菜单上指向“添加”,然后选择“文件夹”。
    将“新建文件夹 #1”重命名为“示例”。
    此步骤创建两个简单的文本文件,如果用户在自定义对话框中选择“安装示例”选项,将安装这两个文本文件。

    为应用程序创建示例文件

    使用记事本或其他文本编辑器创建一个包含文本“这是 rules.vbn”的文本文件,然后将其保存为 Rules.vbn。
    注意 若要防止记事本自动添加 .txt 扩展名,请从“文件类型”下拉列表中选择“所有文件”。
    创建另一个包含文本“这是 memo.vbn”的文本文件,将其保存为 Memo.vbn。
    此步骤将示例文件添加到 Samples 文件夹中,并设置决定是否安装该文件的条件。

    将示例添加到安装程序中

    在解决方案资源管理器中选择“我的记事本安装程序”项目。从“视图”菜单中指向“编辑器”,选择“文件系统”,然后选择“示例”文件夹。
    从“操作”菜单上指向“添加”,然后选择“文件”。将 Rules.vbn 和 Memo.vbn 文件添加到“示例”文件夹中。
    在文件系统编辑器中选择 Rules.vbn。
    在“属性”窗口中,将 Condition 属性设置为 CHECKBOXA1=1。运行安装程序时,只在自定义的复选框被选中时才安装 Rules.vbn 文件。
    在文件系统编辑器中选择 Memo.vbn 文件。
    在“属性”窗口中,将 Condition 属性设置为 CHECKBOXA1=1。运行安装程序时,只在自定义的复选框被选中时才安装 Memo.vbn 文件。
    添加启动条件
    此步骤检查在目标计算机上是否安装了 Internet Explorer 5.0 或更高版本,如果未安装所需版本的 Internet Explorer,将停止安装过程。

    添加启动条件来检查 Internet Explorer 版本

    注意 此步骤旨在阐述启动条件的概念;“我的记事本”应用程序实际上并不依赖于 Internet Explorer。
    在解决方案资源管理器中选择“我的记事本安装程序”项目。在“视图”菜单上指向“编辑器”,然后选择“启动条件”。
    在启动条件编辑器中,选择“目标计算机上的要求”节点。
    在“操作”菜单上,选择“添加文件启动条件”。
    将在“搜索目标计算机”节点下面添加一个“搜索 File1”节点,而在“启动条件”节点下面添加一个“Condition1”节点。

    将“搜索 File1”重命名为“搜索 Internet Explorer”。
    在“属性”窗口中,将 FileName 属性设置为 Iexplore.exe,将 Folder 属性设置为 [ProgramFilesFolder],将 Depth 属性设置为 2,将 MinVersion 属性设置为 5.00。
    选择“Condition1”节点。
    将 Message 属性设置为“该程序需要 Microsoft Internet Explorer 5.0 或更高版本。请安装 Internet Explorer 并重新运行‘记事本’安装程序。”。
    设置可选属性
    此步骤设置一个属性,以便在目标计算机上没有正确版本的 Windows 安装程序时,自动安装 Windows 安装引导程序文件。

    设置部署项目的可选属性

    在解决方案资源管理器中选择“我的记事本安装程序”项目。在“视图”菜单上,选择“属性页”。
    在“我的记事本安装程序”属性页中,选择“引导程序”下拉列表,然后选择“Windows 安装引导程序”。
    在“生成”菜单上选择“生成我的记事本安装程序”。
    在开发计算机上安装
    此步骤将运行安装程序并在开发计算机上安装“我的记事本”。

    在开发计算机上安装“我的记事本”

    在解决方案资源管理器中选择“我的记事本安装程序”项目。在“项目”菜单上选择“安装”。
    注意 必须在计算机上具有安装权限才能运行安装程序。
    部署到其他计算机
    此步骤将运行安装程序并将“我的记事本”安装到其他计算机。

    将“我的记事本”部署到其他计算机上

    在 Windows 资源管理器中,定位到项目目录并查找所生成的安装程序。默认路径是 /documents and settings/yourloginname/My Notepad Installer/project configuration/My Notepad Installer.msi。默认“项目配置”是“调试”。
    将该目录中的我的记事本安装程序 .msi 文件以及其他所有文件和子目录复制到另一台计算机上。
    注意 若要在未连网的计算机上安装,请将文件复制到 CD-ROM 等传统媒体中。
    在目标计算机上双击 Setup.exe 文件来运行安装程序。
    注意 必须在计算机上具有安装权限才能运行安装程序。
    测试
    此步骤将测试从桌面快捷方式启动安装程序和卸载。

    测试安装

    验证快捷方式是否安装到了桌面上以及是否能够正确启动“我的记事本”应用程序。
    使用“控制面板”中的“添加/删除程序”工具卸载该应用程序。
    提示 若要从开发计算机上卸载,请在“项目”菜单上选择“卸载”。

    展开全文
  • winform 打包自动安装数据库,怎么把数据库添加进winform安装包中
  • 我做了一个小的winform程序,使用的是access数据库(数据比较少),所以有一个.mdb文件,还有很多配置文件,包含我记录用户序列号的xml文件,现在想都打包成一个exe文件,就是想让用户不用安装,直接双击就可以运行...
  • C# winform程序怎么打包成安装项目(图解) 1:新建安装部署项目 打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点击确定.(详细见下图) 此主题相关图片如下: 1.jpg...

    转自:http://www.sufeinet.com/thread-2186-1-1.html

    C# winform程序怎么打包成安装项目(图解)     1:新建安装部署项目
    打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点击确定.(详细见下图)
    此主题相关图片如下:

    1.jpg (107.24 KB, 下载次数: 567)

    下载附件

    2013-3-22 11:49 上传


    2:安装向导
    关闭后打开安装向导,点击下一步,或者直接点击完成.


    3:开始制作
    安装向导完成后即可进入项目文件夹:
    双击"应用程序文件夹"在右边的空白处右击,选择添加->文件,将你的做的应用程序的可执行文件和相应的类库和组件添加进来.

    4.jpg (89.39 KB, 下载次数: 548)

    下载附件

    2013-3-22 11:49 上传



    然后右击你的可执行文件,创建快捷方式,然后把快捷方式分别剪切或复制到左边的"用户的'程序'菜单"和"用户桌面"中.
    这样安装程序安装安装完成后会在 "开始->所有程序"和"桌面"上生成程序的快捷方式.

    10.jpg (76.13 KB, 下载次数: 570)

    下载附件

    2013-3-22 11:49 上传


    然后右击左边的"应用程序文件夹"打开属性对话框:

    将属性中的"defaultlocation"的路径中的"[manufacturer]"去掉,
    不然的话做好的安装程序默认安装目录会是"c:\programm file\你的用户名\安装解决方案名称";

    然后打开解决方案管理器,右击你的解决方案名称,选择属性:


    在打开的属性页中,选择"系统必备",

    3.jpg (69.45 KB, 下载次数: 553)

    下载附件

    2013-3-22 11:49 上传




    在打开的系统必备页中,选中如下中的选择项,这个很重要!!!!!1!!!!!
    选上以后,在生成的安装文件包中包含.netframework组件.(这个选项默认是没有选中的)

    7.jpg (115.85 KB, 下载次数: 550)

    下载附件

    2013-3-22 11:49 上传



    好了,这样就完成99%了,然后点击"生成->生成解决方案",哈,生成成功!
    4:制作完成
    现在打开解决方案文件夹下的debug文件夹,就可以看到生成的安装文件了.

    6.jpg (76.35 KB, 下载次数: 536)

    下载附件

    2013-3-22 11:49 上传



    【续】关于"卸载"功能的添加
    上面的文章只介绍了简单的生成安装的方法,
    但是在vs.net2005下并没有直接生成卸载程序的功能,
    所以我们只好用msi来实现了,
    原理我就不讲了,网上一搜一堆,我只讲操作,
    【1】:在添加你的应用程序项目的时候,多添加一个msiexec.exe进去,
    这个文件在c:\windows\system32文件夹下,

    2.jpg (110.56 KB, 下载次数: 540)

    下载附件

    2013-3-22 11:49 上传


    添加进去以后,为了让他更像个卸载程序,把他的名字改成"Uninstall.exe",



    当然这个关系不大,改不改都行的.
    然后给他创建一个快捷方式,放到桌面或者"开始-程序"中,
    我选择放在了开始菜单中,然后下面我们要的做的就是查找这个部署项目的ProductCode了,
    鼠标左键单击项目名称,记住是左键单击,然后点击属性标签,注意:不是右击的属性,
    这个区别很大,这时你就可以看到ProductCode了,

    9.jpg (69.82 KB, 下载次数: 558)

    下载附件

    2013-3-22 11:49 上传



    然后打开你创建的那个快捷方式的属性对话框,
    在Aguements属性中输入"/x {ProductCode}",

    8.jpg (69.01 KB, 下载次数: 522)

    下载附件

    2013-3-22 11:49 上传




    11.jpg (67.79 KB, 下载次数: 566)

    下载附件

    2013-3-22 11:49 上传



    好了,然后点击"生成解决方案"即可生成带有卸载功能的安装程序了.
    展开全文
  • 同一个winform程序,因为业务的原因,修改了两个版本,比如说A,B!!但是生成安装程序的时候,A版本安装成功,但是安装B版本的时候,出错1638,已安装此产品的另一个版本。无法继续进行此版本的安装。要配置或删除...
  • C#WinForm打包程序

    2013-03-15 09:32:18
    C#WinForm打包程序 图文结合 一步一步的 菜鸟级别的
  • VS2015 如何打包winform 安装程序

    千次阅读 2019-04-17 21:01:48
    VS2015 如何打包winform 安装程序 同学们在完成程序开发之后,可能会为如何将其打包安装到其他电脑上的问题而发愁。本文针对C#项目打包,包括打包集成Microsoft .NET Framework等,为大家介绍InstallShield的使用...

    VS2015 如何打包winform 安装程序

    同学们在完成程序开发之后,可能会为如何将其打包并安装到其他电脑上的问题而发愁。本文针对C#项目打包,包括打包集成Microsoft .NET Framework等,为大家介绍InstallShield的使用方法。

    准备:

    • Visual Studio 2015 (其他版本差别不大)
    • InstallShield Limited Edition for Visual Studio

    没有installshield的同学,可以去该网址下载。
    https://info.flexerasoftware.com/IS-EVAL-InstallShield-Limited-Edition-Visual-Studio
    用自己的邮箱注册完,会有注册码和下载链接,无需破解。

    1. 新建项目

    1.1 首先我们创建一个打包的项目:新建项目——其他项目类型——安装和部署——InstallShield Limited Edition Project
    在这里插入图片描述
    1.2 打开后的界面如下图,按照界面提示步骤,一步步进行设置(设置过程没有先后顺序的要求)
    在这里插入图片描述

    2. 设置Application Information(应用程序基本信息)

    2.1 按情况填写公司名称、程序名称、版本号等基本信息
    在这里插入图片描述
    2.2 点击左侧General Information(一般信息),打开如下界面。

    • 1 产品代码:每次升级,重新打包,只需要点击这一行右侧的“…”按钮,就会重新生成Code,安装时就会自动覆盖老版本
    • 2 安装语言:选择简体中文
    • 3 安装位置,若想在安装的时候改变安装的位置,则新建一个文件夹,表示要安装在自己定义的位置,而不是电脑上给定的那些位置上。
    • 4 字体:宋体或其他中文字体
      在这里插入图片描述

    3. 设置安装要求

    设置要安装的程序所需的运行环境,安装包会在安装前进行检测,不满足要求则不能安装。
    在这里插入图片描述

    4. 添加应用程序文件

    4.1 点击Application Files(应用程序文件),打开界面如下图所示
    在这里插入图片描述
    4.2 点击Add Files(添加文件),添加要打包的文件、程序
    如果只是简单的Winform程序,选择程序保存路径下的bin—Debug—程序名.exe文件即可。
    如果调用了dll文件,则需要都添加进来。
    在这里插入图片描述

    5. 设置快捷方式

    5.1. 点击Application Shortcuts(设置快捷方式),打开如图5.1界面
    在这里插入图片描述
    5.2. 框中选项分别为:

    • 在开始菜单中创建快捷方式
    • 在桌面上创建快捷方式
    • 使用其他快捷方式图标
      按需求设置即可
      注:点击图标可以修改快捷方式的名称(如图修改为“计算器”)
      在这里插入图片描述

    6. 注册表设置

    点击Application Registry,进入注册表设置界面,可以根据需求自行修改,也可以直接跳过。
    在这里插入图片描述

    7. 设置安装访谈

    7.1 点击Installation Interview(安装访谈),打开如下界面,框中设置由上到下依次为:

    • 是否显示许可协议对话框?
    • 是否要提示用户输入公司名称和用户名?
    • 是否允许用户自定义安装位置?
    • 是否允许用户在安装时启动程序?
      在这里插入图片描述
      7.2 点击左侧Dialogs,打开如下界面,可以更直观地设置安装访谈。
      在这里插入图片描述

    8. 将.NET Framework打包

    打开解决方案资源管理器——Specify Application Data——Redistributables,打开图8.2所示界面,选择Microsoft .NET Framework 4.0 Full即可
    在这里插入图片描述
    在这里插入图片描述

    9. 最后的设置

    9.1 打开解决方案资源管理器——Prepare for Release——Releases,打开界面如下图所示
    在这里插入图片描述
    9.2 具体设置
    选项卡点击“Setup.exe”
    –找到“Required Execution Level”–选择“Administrator”
    –找到 “InstallShield Prerequisites Location”,选择“Extract From Setup.exe”
    在这里插入图片描述

    10. 生成.exe安装文件

    解决方案右击——重新生成解决方案。
    在这里插入图片描述
    编译完成后可以在该项目保存目录的Express——CD_ROM——Disklmages——DISK1路径下找到安装文件
    在这里插入图片描述
    双击打开即可开始安装
    在这里插入图片描述

    ————供稿人:地信17郑威鹏

    扫码关注我们,了解更多文章:

    三山半落,一水中分。地纵经纬,理入乾坤。
    ~ 兰州交通大学地理信息科学爱好者集散地,欢迎你的加入~
                              
    微信公众号                                                           QQ交流群
    展开全文
  • WinForm项目程序打包安装流程操作。
  • 我的一个winform程序打包后,在我自己的电脑安装成功后,打开没有问题,在经常做测试的笔记本上打开也没有问题。但在另一台电脑上安装之后打开出现错误,会弹出以下错误,请各位大侠指点一二。 [img=...
  • 图解winform打包程序

    2011-06-29 17:13:57
    自己总结的非常详细的c# winform打包程序,现在拿出来和大家分享,顺便赚点分享分。包括每步操作的图解和部分代码。
  • 2.需要添加一个Windows服务用于监控Winform程序的进程,防止退出,并且在Winform安装部署程序中也要安装此服务。 解决方法: WinForm的Project就不说了。 Windows服务程序的添加和ProjectIns

    这里仅简单记录一下,自己备忘。至于能否给大家参考,请大家自行阅读。


    需求:

    1.目前有一个WinForm程序,需要制作安装部署程序

    2.需要添加一个Windows服务用于监控Winform程序的进程,防止退出,并且在Winform的安装部署程序中也要安装此服务。


    解决方法:

    WinForm的Project就不说了。

    Windows服务程序的添加和ProjectInstaller的添加

    • 在sln下面新建一个Window服务程序,在Winfows服务是Service1的设计界面点击右键“添加安装程序”,添加一个ProjectInstaller
    • ProjectInstaller部分代码如下,在相应方法内写自定义操作的相关代码
      public partial class ProjectInstaller : System.Configuration.Install.Installer
          {
              public ProjectInstaller()
              {
                  InitializeComponent();
      
                  this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;//设置服务为自动启动
                  this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalService;//设置服务安装指定的账号为本地系统
      
                  writeLog("xxxWindowsService ProjectInstaller run.");
              }
      
              public override void Install(System.Collections.IDictionary stateSaver)
              {
                  base.Install(stateSaver);
              }
      
              protected override void OnAfterInstall(IDictionary savedState)
              {
                  base.OnAfterInstall(savedState);
                  
                  writeLog("enter OnAfterInstall ");
                      
                  writeLog("leave OnAfterInstall ");
                  
              }
      
              protected override void OnBeforeUninstall(IDictionary savedState)
              {
                  base.OnBeforeUninstall(savedState);
                  
                  writeLog("enter OnBeforeUninstall ");                
      
                  writeLog("leave OnBeforeUninstall ");
                  
              }



    安装项目的添加

    sln右键添加新建项目-其他项目类型-安装和部署-Visual Studio Installer-安装项目。

    在解决方案资源管理器点击Setup1,再点击vs2010工具栏的属性图标(ctrl+w,p),在弹出的属性框内设置Setup项目的相关属性,包括Auther,Manufacturer,productName等属性。

    在解决方案资源管理器点击Setup1,再点击vs2010工具栏的属性图标(ctrl+w,p),在左侧设计界面弹出文件系统编辑器,点击应用程序文件夹,在中间窗口右键添加项目输出,添加安装程序所需的相关dll等文件。这里不再详细说具体的步骤了,网上baidu,google一大把。

    现在说添加安装windows服务:

    • 在文件系统编辑器中添加Window服务项目作为主输出后,Setup项目生成Setup文件安装时就会自动在安装Winform程序的时候安装Windows服务。
    • 下面是如何在安装WindowsService过程中获取自定义参数的配置。
    • 在解决方案资源管理器点击Setup1,再点击解决方案资源管理器顶部的自定义操作编辑器图标。
    • 在自定义操作编辑器设计区域右键点击“安装”添加项目输出(这个项目输出要选中Windows服务那个项目)。
    • 选中刚刚添加的项目输出,右键属性窗口,设置CustomActionData值为 /TARGETDIR="[TARGETDIR]\",注意,这里设置这个参数目的是能在Windows服务中的ProjectInstaller的方法中能获取到用户在安装过程中选中的安装程序路径。在ProjectInstaller中的OnAfterInstall方法中通过代码Context.Parameters.ContainsKey("TARGETDIR")获取到用户在安装过程中选中的安装程序路径。
    • 右键点击“卸载”添加项目输出(这个项目输出要选中Windows服务那个项目)。重复上一步的操作设置属性相应值。

    完整ProjectInstaller的代码如下:

       [RunInstaller(true)]
        public partial class ProjectInstaller : System.Configuration.Install.Installer
        {
            private string softWareMainFolder = "xxxMain";//Setup程序中配置的应用程序文件内自定义的主程序文件夹名
            private string softWareServiceFolder = "xxxService";//Setup程序中配置的应用程序文件内自定义的服务程序文件夹名
            private string serviceName = "xxxWinService";//服务名称
    
    
            public ProjectInstaller()
            {
                InitializeComponent();
    
    
                this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;//设置服务为自动启动
                this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;//设置服务安装指定的账号为本地系统
    
    
                writeLog(Environment.NewLine);//添加换行便于日志查看      
                writeLog("xxxWindowsService ProjectInstaller run.");
            }
    
    
            public override void Install(System.Collections.IDictionary stateSaver)
            {
                base.Install(stateSaver);
            }
    
    
            protected override void OnAfterInstall(IDictionary savedState)
            {
                base.OnAfterInstall(savedState);
    
    
                //安装成功后更改服务配置文件中的被监控程序的路径
    
    
                try
                {
                    writeLog("enter OnAfterInstall ");
                    #region 测试自定义参数
                    writeLog("Context.Parameters.Keys.Count= " + Context.Parameters.Keys.Count.ToString());
    
    
                    StringBuilder keysValues = new StringBuilder(string.Empty);
                    foreach (string s in Context.Parameters.Keys)
                    {
                        if (keysValues.Length > 0)
                        {
                            keysValues.Append(",");
                            keysValues.Append(Environment.NewLine);
                        }
                        keysValues.Append(s);
                        keysValues.Append("=");
                        string v = Context.Parameters[s];
                        keysValues.Append(v);
                    }
    
    
                    writeLog("Context.Parameters.Keys-Values:" + keysValues);
    
    
    
    
                    if (Context.Parameters.Keys.Count <= 0)
                    {
                        writeLog("Context.Parameters.Keys.Count <= 0, OnAfterInstall exit");
                        return;
                    }
                    if (Context.Parameters.ContainsKey("TARGETDIR") == false)
                    {
                        writeLog("Context.Parameters.ContainsKey(TARGETDIR) == false, OnAfterInstall exit");
                        return;
                    }
                    #endregion
    
    
                    #region 更改服务exe.config中守护的主程序地址
    
    
                    var map = new ExeConfigurationFileMap();
    
    
                    writeLog("Context.Parameters[TARGETDIR]=" + Context.Parameters["TARGETDIR"]);
    
    
                    string path = Context.Parameters["TARGETDIR"];
                    writeLog("old TARGETDIR=" + path);
                    path = path.Replace(@"\\", @"\");
                    writeLog("new TARGETDIR=" + path);
    
    
                    //Get app.config path
                    map.ExeConfigFilename = path + softWareServiceFolder + @"\xxxWindowsService.exe.config";
    
    
                    writeLog("map.ExeConfigFilename=" + map.ExeConfigFilename);
    
    
                    //Get Config and AppSettings
                    var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
                    var appSettings = config.AppSettings;
    
    
                    //Get input value from setup project
                    //var configValueList = new List<string>() { Context.Parameters["Config1"], 
                    //                                           Context.Parameters["Config2"], 
                    //                                           Context.Parameters["Config3"] };
    
    
                    string cpsExePath = path + softWareMainFolder + @"\xxx.exe";
    
    
                    writeLog("appSettings.Settings[Watch_Process1].Value=" + appSettings.Settings["Watch_Process1"].Value);
                    writeLog("new dir=" + cpsExePath);
                    //assign input value to appSettings
                    appSettings.Settings["Watch_Process1"].Value = cpsExePath;
                    int SessionID = GetExplorerProcessSessionID();
                    appSettings.Settings["SessionId"].Value = SessionID.ToString();
    
    
    
    
                    //save app.config
                    config.Save();
    
    
                    #endregion
    
    
                    //注意这里只需添加启动服务的代码即可,无需添加安装服务的代码因为安装服务的功能在安装程序的自定义界面中已定义
    #if useBatStartOrStop
                    #region 执行启动服务
    
    
                    string installbatPath = path + softWareServiceFolder + @"\startService.bat";
                    RunBat(installbatPath);
    
    
                    #endregion
    #else
                    StartService(serviceName);//用C#的方式启动服务
    #endif
    
    
                    writeLog("leave OnAfterInstall ");
                }
                catch (Exception e)
                {
                    writeLog(e.Message);
                }
            }
    
    
            protected override void OnBeforeUninstall(IDictionary savedState)
            {
                base.OnBeforeUninstall(savedState);
    
    
                //卸载前先停止服务
                try
                {
                    writeLog("enter OnBeforeUninstall ");
                    //#region 测试自定义参数
                    //writeLog("Context.Parameters.Keys.Count= " + Context.Parameters.Keys.Count.ToString());
    
    
                    //StringBuilder keysValues = new StringBuilder(string.Empty);
                    //foreach (string s in Context.Parameters.Keys)
                    //{
                    //    keysValues.Append(s);
                    //    keysValues.Append("=");
                    //    string v = Context.Parameters[s];
                    //    keysValues.Append(v);
                    //    keysValues.Append(",");
                    //    keysValues.Append(Environment.NewLine);
                    //}
    
    
                    //writeLog("Context.Parameters.Keys-Values:" + keysValues);
    
    
                    //if (Context.Parameters.ContainsKey("TARGETDIR") == false)
                    //{
                    //    writeLog("Context.Parameters.ContainsKey(TARGETDIR) == false, OnAfterInstall exit");
                    //    return;
                    //}
                    //#endregion
    
    
                    //writeLog("Context.Parameters[TARGETDIR]=" + Context.Parameters["TARGETDIR"]);
    
    
                    //string path = Context.Parameters["TARGETDIR"];
                    //writeLog("old TARGETDIR=" + path);
                    //path = path.Replace(@"\\", @"\");
                    //writeLog("new TARGETDIR=" + path);
    
    
                    //注意这里只需添加停止服务的代码即可,无需添加删除服务的代码因为删除服务的功能在安装程序的自定义界面中已定义
    #if useBatStartOrStop
    
    
                    #region 执行bat停止服务
                    writeLog("start StopService");
                    string stopServicebatPath = path + softWareServiceFolder + @"\stopService.bat";
                    RunBat(stopServicebatPath);
                    writeLog("end StopService");
                    #endregion
    #else
                    StopService(serviceName);//用C#方式停止服务
    
    
    #endif
    
    
                    #region 结束进程
                    writeLog("start kill xxx.exe ");
    
    
                    KillProcess("xxx");//StopProcess("KmisToVams");//根据进程名结束进程
    
    
                    writeLog("end kill xxx.exe");
                    #endregion
    
    
                    //#region 执行bat卸载服务
    
    
                    //string uninstallbatPath = path + @"cpsServiceWatch\uninstall.bat";
                    //RunBat(uninstallbatPath);
    
    
                    //#endregion
    
    
                    writeLog("leave OnBeforeUninstall ");
                }
                catch (Exception ex)
                {
                    writeLog(ex.Message);
                }
            }
    
    
            //执行批处理文件
            private void RunBat(string batPath)
            {
                writeLog("enter RunBat  run" + batPath);
    
    
                Process pro = new Process();
    
    
                FileInfo file = new FileInfo(batPath);
                pro.StartInfo.WorkingDirectory = file.Directory.FullName;
                pro.StartInfo.FileName = batPath;
                pro.StartInfo.CreateNoWindow = false;
                pro.Start();
                pro.WaitForExit();
    
    
                writeLog("leave RunBat");
            }
    
    
            /// <summary>
            /// 检查缓存文件存放的目录是否存在,如果不存在则创建。
            /// </summary>
            /// <param name="directoryPath"></param>
            public void CheckDirectory(string directoryPath)
            {
                DirectoryInfo dInfo = new DirectoryInfo(directoryPath);
                if (!dInfo.Exists)
                {
                    dInfo.Create();
                }
            }
    
    
            //记录安装日志,日志在C:\vams_install\vams_install_yyyyMMdd.log中
            void writeLog(string msg)
            {
                string dir = @"C:\kmisToAei_install_logs\";
                CheckDirectory(dir);
                FileInfo fileLog = new FileInfo(dir + @"k2a_install_" + DateTime.Today.ToString("yyyyMMdd") + ".log");
                FileStream fileStream = null;
                StreamWriter swOld = null;
                StreamWriter swNew = null;
                string currentTime = string.Format("[{0}:{1,4:D}] ", DateTime.Now.ToString(), DateTime.Now.Millisecond);
                try
                {
                    //判断是否存在文件
                    if (fileLog.Exists)
                    {
                        fileStream = new FileStream(fileLog.FullName, FileMode.Append, FileAccess.Write);
    
    
                        //如果存在文件,则向文件添加日志
                        swOld = new StreamWriter(fileStream);
                        //swOld.WriteLine();
                        //swOld.WriteLine("============================================================================");
                        swOld.Write(currentTime + ":");
                        swOld.WriteLine(msg);
                        swOld.Flush();
                        swOld.Close();
    
    
    
    
                    }
                    else
                    {
                        fileStream = fileLog.Create();
    
    
    
    
                        //如果文件不存在,则创建文件后向文件添加日志
                        swNew = new StreamWriter(fileStream);
    
    
                        //swNew.WriteLine();
                        //swNew.WriteLine("============================================================================");
                        swNew.Write(currentTime + ":");
                        swNew.WriteLine(msg);
                        swNew.Flush();
                        swNew.Close();
    
    
                    }
                }
                catch
                {
    
    
                }
                finally
                {
                    if (fileStream != null)
                    {
                        fileStream.Close();
                        fileStream.Dispose();
                    }
                    if (swOld != null)
                    {
                        swOld.Close();
                        swOld.Dispose();
                    }
                    if (swNew != null)
                    {
                        swNew.Close();
                        swNew.Dispose();
                    }
    
    
                }
    
    
            }
    
    
    
    
            private void KillProcess(string processName)
            {
                writeLog("enter KillProcess processName" + processName);
                System.Diagnostics.Process myproc = new System.Diagnostics.Process();
                //得到所有打开的进程   
                try
                {
                    //#region 打印所有进程
                    //StringBuilder allproc = new StringBuilder();
                    //Process[] arrayProcess = Process.GetProcesses();
                    //foreach (Process p in arrayProcess)
                    //{
                    //    allproc.AppendLine(p.Id + ":" + p.ProcessName);
                    //}
                    //writeLog("all process:" + allproc.ToString());
                    //#endregion
    
    
                    writeLog("processName[" + processName + "]count=" + Process.GetProcessesByName(processName).Length);
    
    
                    foreach (Process thisproc in Process.GetProcessesByName(processName))
                    {
                        找到程序进程,kill之。
                        //if (!thisproc.CloseMainWindow())
                        //{
                        //    thisproc.Kill();
                        //}
    
    
    
    
                        //找到程序进程先正常关闭,正常关闭失败时kill之。
                        bool closeUI = false;
                        for (int i = 0; i < 5; i++)
                        {
                            if (thisproc.CloseMainWindow())
                            {
                                closeUI = true;
                            }
                            else
                            {
                                System.Threading.Thread.Sleep(1000);//如果关闭窗口失败则循环5次尝试
                            }
                        }
                        writeLog("KillProcess closeUI=" + closeUI.ToString());
                        if (closeUI == false)
                        {
                            thisproc.Kill();
    
    
                            thisproc.WaitForExit(5000);
    
    
                            thisproc.Close();//清理资源
    
    
                            writeLog("KillProcess run kill ");
                        }
                    }
    
    
                }
                catch (Exception Exc)
                {
                    //MessageBox.Show(Exc.Message);
                    writeLog(Exc.Message);
                }
                writeLog("leave KillProcess");
            }
    
    
    
    
            public void StopProcess(string processName)
            {
                writeLog("enter StopProcess");
                try
                {
                    System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName(processName);
                    foreach (System.Diagnostics.Process p in ps)
                    {
                        p.CloseMainWindow();//关闭UI
    
    
                        System.Threading.Thread.Sleep(2000);
    
    
                        p.Kill();
    
    
                        p.WaitForExit(5000);
    
    
                        p.Close();//清理资源
                    }
                }
                catch (Exception ex)
                {
                    KillProcess(processName);
    
    
                    //throw ex;
                    writeLog(ex.Message);
                }
                writeLog("leave StopProcess");
            }
    
    
            /// <summary>
            /// 获取explorer.exe进程的SessionID
            /// </summary>
            /// <returns></returns>
            public int GetExplorerProcessSessionID()
            {
                int sessionId = 0;
                try
                {
                    Process[] arrayProcess = Process.GetProcesses();
                    foreach (Process p in arrayProcess)
                    {
                        //System、Idle进程会拒绝访问其全路径
                        if (p.ProcessName.ToLower() == "explorer")
                        {
                            sessionId = p.SessionId;
                            writeLog("explorer sessionId=" + p.SessionId.ToString());
                            break;
                        }
                    }
                }
                catch { }
    
    
                return sessionId;
            }
    
    
            #region 服务处理
    
    
            #region 检查服务存在的存在性
            /// <summary>  
            /// 检查服务存在的存在性  
            /// </summary>  
            /// <param name=" NameService ">服务名</param>  
            /// <returns>存在返回 true,否则返回 false;</returns>  
            public bool IsServiceIsExisted(string NameService)
            {
                ServiceController[] services = ServiceController.GetServices();
                foreach (ServiceController s in services)
                {
                    if (s.ServiceName.ToLower() == NameService.ToLower())
                    {
                        return true;
                    }
                }
                return false;
            }
            #endregion  
    
    
            #region 判断window服务是否启动
            /// <summary>  
            /// 判断某个Windows服务是否启动  
            /// </summary>  
            /// <returns></returns>  
            public bool IsServiceStart(string serviceName)
            {
                ServiceController psc = new ServiceController(serviceName);
                bool bStartStatus = false;
                try
                {
                    if (psc.Status.Equals(ServiceControllerStatus.Running)||
                        psc.Status.Equals(ServiceControllerStatus.ContinuePending)||
                        psc.Status.Equals(ServiceControllerStatus.StartPending)
                        )
                    {
                        bStartStatus = true;
                    }
    
    
                    return bStartStatus;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
            #endregion  
    
    
            #region 启动服务
            private void StartService(string serviceName)
            {
                if (IsServiceIsExisted(serviceName))
                {
                    ServiceController sc = new ServiceController(serviceName);
                    if (sc.Status != ServiceControllerStatus.Running
                        && sc.Status != ServiceControllerStatus.StartPending)
                    {
                        writeLog(string.Format("准备启动服务{0}", serviceName));
                        sc.Start();
                        writeLog(string.Format("正在启动服务{0}", serviceName));
                        sc.WaitForStatus(ServiceControllerStatus.Running);
                        writeLog(string.Format("已成功启动服务{0}", serviceName));
                    }
                    else 
                    {
                        writeLog(string.Format("本次启动服务{0}的请求被取消,因为服务正在启动或已启动", serviceName));
                    }
                }
                else 
                {
                    writeLog(string.Format("服务{0}不存在,无法启动", serviceName));
                }            
            }
            #endregion
    
    
            #region 停止服务
            private void StopService(string serviceName)
            {            
                if (IsServiceIsExisted(serviceName))
                {
                    ServiceController sc = new ServiceController(serviceName);
                    if (sc.Status != ServiceControllerStatus.Stopped
                        &&sc.Status!=ServiceControllerStatus.StopPending)
                    {
                        writeLog(string.Format("准备停止服务{0}", serviceName));
                        sc.Stop();
                        writeLog(string.Format("正在停止服务{0}", serviceName));
                        sc.WaitForStatus(ServiceControllerStatus.Stopped);
                        writeLog(string.Format("已成功停止服务{0}", serviceName));
                    }
                    else 
                    {
                        writeLog(string.Format("本次停止服务{0}的请求被取消,因为服务正在停止或已停止", serviceName));                
                    }
                }
                else
                {
                    writeLog(string.Format("服务{0}不存在,无法停止", serviceName));
                }            
            }
            #endregion  
    
    
            #endregion
        }
    展开全文
  • C# winform程序怎么打包成安装项目(VS2010图解) 作为研发人员,在本机上开发的winform、wpf或者控制台程序需要发给其他人测试时候,一般需要对其进行打包生成setup安装文件,根据网上查找的资料并结合自己打包成功...
  • 前言 近期被公司外派到驻空调厂的项目组,支援一个TCP相关的程序...Winform打包 做完之后呢,考虑到要放在服务器上面,所以,直接采用打包的方式,具体打包流程如下: 首先呢,打包需要用到 InstallShield Limit
  • 最近开发了一个小软件。由于需要打包。网上找了一些资料。然后整合了起来。希望对大家有所帮助。不全面请见谅。 打包控件InstallShield-Limited-Edition 下面是注册地址 ...
  • 一、安装打包插件 注:安装好重启vs2017 二、打包过程 添加文件入口
  • winform打包安装

    2018-03-18 15:14:51
    1、 在vs2010 选择“新建项目”=》“ 其他项目类型”=》“ Visual Studio ...“用户的‘程序’菜单”表示:应用程序安装完,用户的“开始菜单”中的显示的内容,一般在这个文件夹中,需要再创建一个文件用来存放...
  • winForm程序打包工具

    2018-11-22 13:59:11
    winForm程序打包工具
  • C# winform程序怎么打包成安装项目

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,408
精华内容 1,763
关键字:

winform打包成安装程序