学习:Web安装项目创建桌面快捷方式及重写安装类(转)

一、WEB安装项目部署

1、新建:

新建项目-安装和部署项目-WEB安装项目

2、部署:

(1)进入文件系统视图,"项目-右键-视图-文件系统";也可以直接点"解决方案资源管理器"上部的快捷图标
(2)
"WEB应用程序文件夹"添加文件,例如aspx文件,ico文件,bin目录及文件,images目录及文件等
(3)
设置虚拟目录属性,右击"WEB应用程序文件夹"选属性,一般只须修改默认文档"defaultdocument"以及虚拟目录名"VirtualDirectorly"(若有多个虚拟目录
(4)Web
安装项目默认没有提供"用户的程序菜单",需要自己创建:右击"目标计算机上的文件系统-添加特殊文件夹-用户的程序菜单"
(5)Web
安装项目默认也没有用户桌面目录,添加方法同上
右击"目标计算机上的文件系统-添加特殊文件夹-WEB自定义文件夹",逐次添加多个,但需要指出的是,这些多的虚拟目录只能在设计时设置好名称等属性,而在安装过程中却无从控制)

补充:

web项目部署时,添加网站有两种方式:
把你的网站先发布,然后把发布后的页面一一添加进来同时把诸如images之类的文件夹要在安装部署项目中文件夹然后再添加其下文件
在安装部署项目中添加项目输出,选择你的网站,但这样做部署项目会把你网站所有文件包括.cs文件原样打包进去,不太好

二、重写安装类:

1、作用:

安装类是在安装部署项目被生成后,在被"安装","提交","回滚","卸载"的过程中来完成一些自定义的操作

2、创建:

(1)新建一个类库项目
(2)
删掉类库中原有类文件,新建一个"安装程序类"("添加新项"中有这个模版的)
(3)
自定义方法:这个安装类特殊就在于引用了System.Configuration.Install.dllusing System.Configuration.Install和继承:Installer
在自定义方法中主要是对Install,Uninstall,Commit,Rollback方法进行override重写

3、使用:

创建完后,还不起效,要和安装部署项目配合才得以使用

方法一:

(1)在安装部署项目中将刚才类库项目添加为"项目输出-主输出"
(2)
在安装部署项目"视图-自定义操作""安装","提交","回滚","卸载"等操作上"右键-添加自定义操作"选择刚才添加的类库项目输出

方法二:

(1)将类库进行编译,生成.dll
(2)
在安装部署项目"视图-自定义操作""安装","提交","回滚","卸载"等操作上"右键-添加自定义操作"选择文件,浏览到你编译生成的.dll

至此,你所写的安装类将在"安装","卸载","回滚","提交"过程中起效了!

三、为Web安装项目添加桌面快捷方式及图标

1Web安装项目特殊于一般的安装部署项目:

(1)Web安装项目无法在自身加入的网站项目中创建快捷方式,可以借助创建.url文件方式来创建(:.lnk也是快捷方式文件,但安装部署项目不允许添加.lnk文件,却可以添加.url文件)
(2)Web
安装项目默认没有用户桌面和用户程序菜单的添加,"文件系统视图-右键-添加特殊文件夹-***"中添加一些特殊操作
(3)Web
安装项目在安装过程中用户自己动态设置"虚拟目录",所以.url文件中不能先前定死http://localhost/***,只能通过"安装类"在自定义"安装"操作时动态创建

2、创建"安装类"并添加到Web安装项目的"自定义操作""安装"

内容如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Configuration.Install;

 

using System.IO;

using System.DirectoryServices;//操作IIS虚拟目录

 

namespace TestInstallCLB

{

    [RunInstaller(true)]

    public partial class Installer2 : Installer

    {

        public Installer2()

        {

            InitializeComponent();

        }

        public override void Install(System.Collections.IDictionary stateSaver)

        {

            // 创建桌面快捷方式及图标,借助.url生成网络快捷方式

 

            // 先进行安装,因为安装后才会有安装目录

            base.Install(stateSaver);  

 

            //获取软件安装的物理目录,形如:D:\Inetpub\wwwroot\Endy_Web\InstallClass.dll

            string fname = System.Reflection.Assembly.GetExecutingAssembly().Location;

 

            //也可以获取软件安装的物理目录,和上面获取的结果一样,形如:D:\Inetpub\wwwroot\Endy_Web\InstallClass.dll

            //string fname2 = Context.Parameters["assemblypath"];

 

            string[] sz = fname.Split(new char[] { '\\' });

            StreamWriter sw = new StreamWriter(File.Open(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\测试站点.url", FileMode.Create, FileAccess.Write));

            sw.WriteLine("[InternetShortcut]");

            sw.WriteLine("URL=http://localhost/" + sz[sz.Length - 2]);

            sw.WriteLine("IconFile=" + fname.Substring(0, fname.LastIndexOf("\\")) + "\\logo.ico");

            sw.WriteLine("IconIndex=0");

            sw.Flush();

            sw.Close();

 

            //创建用户"程序"菜单快捷方式及图标,借助.url生成网络快捷方式(要和界面添加的用户程序目录一致)

            /*处理"开始-程序"目录的位置,因为默认SpecialFolder.Programs会到当前用户的程序目录下,而我们要处理到All User的程序目录下,

            因为在web部署项目中添加卸载快捷方式时,我们在"文件系统视图-右键-添加特殊文件夹-用户的'程序'菜单"是添加到All User的程序目录下的,所以下面用程序创建的要和界面添加的保持一致,

            同时当添加到All User的程序目录下,那么所有用户的程序菜单中都会有的*/

            string str = Environment.GetFolderPath(Environment.SpecialFolder.Programs);

            string[] arr = str.Split(new char[] { '\\' });

            arr[arr.Length - 3] = "All Users";

            string t = "";

            foreach (string i in arr)

            {

                t += i + "\\";

            }

 

            StreamWriter swr = new StreamWriter(File.Open(t + "测试站点.url", FileMode.Create, FileAccess.Write));

            swr.WriteLine("[InternetShortcut]");

            swr.WriteLine("URL=http://localhost/" + sz[sz.Length - 2]);

            swr.WriteLine("IconFile=" + fname.Substring(0, fname.LastIndexOf("\\")) + "\\logo.ico");

            swr.WriteLine("IconIndex=0");

            swr.Flush();

            swr.Close();

 

        }

 

        public override void Uninstall(System.Collections.IDictionary savedState)

        {

            base.Uninstall(savedState); // 先进行卸载

            //删除虚拟目录[有问题不能用]

            //System.DirectoryServices.DirectoryEntry dirroot = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT");

            //DirectoryEntry Dirport = dirroot.Children.Find("Endy_Web","IIsVirtualDir");

            //Dirport.Invoke("AppDelete", true);

            //dirroot.CommitChanges();

            //删除安装文件夹[有问题不能用]

            //string fname = Context.Parameters["assemblypath"];

            //if (Directory.Exists(fname.Substring(0, fname.LastIndexOf("\\"))))

            //{

            //    DirectoryInfo di=new DirectoryInfo(fname.Substring(0, fname.LastIndexOf("\\")));

            //    foreach (FileInfo f in di.GetFiles())

            //        f.Delete();

            //    di.Delete();

            //}

 

        }

    }

}

四、url文件内容

最后客户端安装完毕后桌面生成快捷方式("我的测试软件.url"实际上是看不到扩展名的)用记事本打开内容如下:
[InternetShortcut]
URL=http://localhost/EndyWeb
IconFile=C:\Inetput\wwwroot\EndyWeb\logo.ico
IconIndex=0

 


文章来源:http://hi.baidu.com/xtuwangzhi/blog/item/472217475dbef80f6a63e5f6.html


转载于:https://www.cnblogs.com/LeimOO/archive/2009/09/03/1559274.html

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

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

相关文章

12c oracle 激活_Oracle 12C 安装教程

Oracle 12c,全称Oracle Database 12c,是Oracle 11g的升级版,新增了很多新的特性。本章节就为大家介绍Oracle 12c的下载和安装步骤。Oracle 12c下载打开Oracle的官方中文网站,选择相应的版本即可。注意:下载时&#xff…

运行试错合集

试错: 在服务器训练好的参数直接被pycharm映射给覆盖了! 记得把这里取消掉! 如果在py文件中修改了代码,手动上传! 就是上面的upload! 运行结果: 运行train的结果 评估阶段: 出错…

LeetCode 806. 写字符串需要的行数

1. 题目 我们要把给定的字符串 S 从左到右写到每一行上,每一行的最大宽度为100个单位,如果我们在写某个字母的时候会使这行超过了100 个单位,那么我们应该把这个字母写到下一行。 我们给定了一个数组 widths ,这个数组 widths[0…

【转载】揭开硬件中断请求IRQ所有秘密(图解)

转载自:http://news.csdn.net/n/20040517/45868.html IRQ(Interrupt Request)的作用就是在我们所用的电脑中,执行硬件中断请求的动作,用来停止其相关硬件的工作状态。比如我们要打印一份文件,在打印结束时就需要由系统对打印机提出…

(七)DKN:用于新闻推荐的深度知识感知网络

摘要: 背景: 新闻语言是高度浓缩的,充满了知识实体和常识。然而,现有的方法并没有意识到一些外在的知识,也不能充分发现新闻之间潜在的知识层面的联系。因此,推荐给用户的结果仅限于简单的模式&#xff0c…

平面方程(Plane Equation)

平面方程(Plane Equation) 原文链接:http://www.songho.ca/math/plane/plane.html翻译:罗朝辉 (http://www.cnblogs.com/kesalin/)本文遵循“署名-非商业用途-保持一致”创作公用协议平面方程平面上的一点以及垂直于该平面的法线唯一定义了 3D 空间的一个…

【DKN】(三)data_preprogress.py

内容 try: # 以绝对导入的方式导入cofig对象,并获取其{model_name}Config! config getattr(importlib.import_module(config), f"{model_name}Config") except AttributeError:print(f"{model_name} not included!")exit()这里…

mask属性是css3的吗_使用CSS3 mask(蒙版,遮罩)属性实现超酷按钮悬停动画

CSS语言:CSSSCSS确定import url("https://fonts.googleapis.com/css?familyLato:100,300,400");import url("https://fonts.googleapis.com/css?familyRoboto:100");* {margin: 0;padding: 0;box-sizing: border-box;}.header {text-align: c…

Java核心API需要掌握的程度

Java的核心API是非常庞大的,这给开发者来说带来了很大的方便,经常人有评论,java让程序员变傻。 但是一些内容我认为是必须掌握的,否则不可以熟练运用java,也不会使用就很难办了。 1、java.lang包下的80%以上的类的功能的灵活运用。…

主成分分析(Principal Component Analysis,PCA)

文章目录1. 总体主成分分析2. 样本主成分分析3. 主成分分析方法3.1 相关矩阵的特征值分解算法3.2 矩阵奇异值分解算法4. sklearn.decomposition.PCA主成分分析(Principal Component Analysis,PCA)是一种常用的无监督学习方法利用正交变换把由…

【DKN】(二)config.py

class BaseConfig():"""General configurations appiled to all models"""num_epochs 2 #迭代次数num_batches_show_loss 100 # Number of batchs to show lossnum_batches_validate 1000 # Number of batchs to check metrics on valid…

log4net异步写入日志_微信支付万亿日志在Hermes中的实践

导语 | 微信支付日志系统利用 Hermes 来实现日志的全文检索功能,自从接入以来,日志量持续增长。目前单日入库日志量已经突破万亿级,单集群日入库规模也已经突破了万亿,存储规模达 PB 级。本文将介绍微信支付日志系统在 Hermes 上的…

使用Axis2调用Web Service

本文作为使用Axis2创建Web Service的后篇,主要介绍如何使用Axis2调用Web Service。有关准备工作详情请参考前篇的内容。 在Eclipse的Packge Explorer中右键点击New,选择Other项,新建一个Axis2 Code Genrateor向导。点击Next,打开向…

LeetCode 旋转数组 系列

旋转数组系列,多数是排序数组进行了旋转,可以使用二分查找。做一个集合,如还有缺失的,可以留言指出,一起加油! LeetCode 33. 搜索旋转排序数组(二分查找) LeetCode 81. 搜索旋转排…

如何并行运行程序

参考了官方文档, torch.nn.parallel.DataParallel 以及https://zhuanlan.zhihu.com/p/102697821 在运行此DataParallel模块之前,并行化模块必须在device_ids [0]上具有其参数和缓冲区。在执行DataParallel之前,会首先把其模型的参数放在devi…

matlab打开笔记本摄像头_matlab窗口调用摄像头

更改”.m“文件:function varargout untitled1(varargin)% UNTITLED1 MATLAB code for untitled1.fig% UNTITLED1, by itself, creates a new UNTITLED1 or raises the existing% singleton*.%% H UNTITLED1 returns the handle to a new UNTITLED…

session过期后登陆页面跳出iframe页面问题

登陆页面增加javascript:function window.onload(){if(window.parent.length>0)window.parent.locationlocation;}转载于:https://www.cnblogs.com/shenyunjun420/archive/2009/09/29/1576400.html

LeetCode 1143. 最长公共子序列(动态规划)

1. 题目 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新…

【DKN】(四)train.py

内容 try: #不用多言, 获得该模块下的model_name函数Model getattr(importlib.import_module(f"model.{model_name}"), model_name)config getattr(importlib.import_module(config), f"{model_name}Config") except AttributeError:print(…

用promise封装ajax_ES6-promise封装AJAX请求

【摘要】ES6-promise封装AJAX请求考必过小编为大家整理了关于ES6-promise封装AJAX请求的信息,希望可以帮助到大家!ES6-promise封装AJAX请求标签:const状态码setreject对象响应状态ISErequest// 接口地址:https://api.apiopen.top/getJoke// 1…