一佳一

记录像1+1一样简洁的代码

导航

自制安装包集成.net framework 4.0

Posted on 2013-03-06 09:47  一佳一  阅读(3913)  评论(2编辑  收藏  举报

最近自己用wpf写了一个安装包,本以为这样就OK了,可是人家提出,要集成 .net framework 4.0,问题来了,wpf是基于.net framework 4.0,没有.net framework 4.0怎么运行,

苦苦研究几天,都没什么结果,有的人说用C++写一个,我觉得比较靠谱,可惜C++我只是学了点皮毛,还没深入,还有用什么飞信框架的,Mono的感觉都不太靠谱,最后突然自己想出了一个办法,用vs安装做个外壳,把我的安装程序包装在里面,这样,没有.net framework的,他会自动提示安装.net framework,然后再自动运行我的安装程序,最后我的步骤如下

 

建立一个安装项目

1.把安装文件放入应用程序文件夹

2.右击-视图-安装界面 把里面的子界面全部删除

3.右击-添加-项目输出(项目看下面的解释,主要用于自动启动自己做的安装包)

4.右击-自定义操作-安装-添加自定义操作-选择你添加到项目输出的那个项目

5.右击-属性-系统必备-从与我的应用程序想通位置下载系统必备组件

这样安装项目就配置好了

接下添加上面说的项目,用于安装好 .net framework后自动启动我自己做的安装包

1.建个类库项目

2.右击项目-添加新项-安装文件类

3.在类中贴入以下代码

/// <summary>
/// 功能是做安装项目主项目输出
/// 实现安装过程中的一些操作
/// 如:安装完成后启动项目
/// </summary>
[RunInstaller(true)]
public partial class Installe : Installer
{
/// <summary>
/// 应用程序入口
/// </summary>
public static void Main()
{
}
/// <summary>
/// 构造函数
/// </summary>
public Installe()
{
InitializeComponent();
}
/// <summary>
/// 重写安装完成后函数
/// 实现安装完成后自动启动已安装的程序
/// </summary>
/// <param name="savedState"></param>
protected override void OnAfterInstall(IDictionary savedState)
{

try
{
base.OnAfterInstall(savedState);

Assembly asm = Assembly.GetExecutingAssembly();
string path = asm.Location.Remove(asm.Location.LastIndexOf("\\")) + "\\";
System.Diagnostics.Process.Start(path + "\\a.exe");//要执行的程序
}
catch (Exception)
{

}
}
/// <summary>
/// 重写安装过程方法
/// </summary>
/// <param name="stateSaver"></param>
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
}
/// <summary>
/// 重写安装之前方法
/// </summary>
/// <param name="savedState"></param>
protected override void OnBeforeInstall(IDictionary savedState)
{
base.OnBeforeInstall(savedState);
}
/// <summary>
/// 重写卸载方法
/// </summary>
/// <param name="savedState"></param>
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
}
/// <summary>
/// 重写回滚方法
/// </summary>
/// <param name="savedState"></param>
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
}
}
}

 

编译成功后,用上面安装包说的,添加到安装包的项目输出,就OK了。这样安装程序只会安装。net 然后运行我自己的安装程序,嘿嘿

但是这样安装程序,他的外壳也被安装在计算机了,不过没事,在你自己的程序卸载的时候,同时把这个外壳程序卸载掉就好了,代码如下

Process.Start("msiexec", "/uninstall {9FDBD1ED-9792-4FD4-9963-52E5974F05A4} /quiet");

注意:{}里面的是你外壳程序的产品编号,/quiet是静默卸载的意思,如果去掉,他会提示你是否要卸载此产品

 

这东西看简单,其实真的还是用了很多自己的时间,转载的童鞋,记得保留我的连接http://www.cnblogs.com/linyijia/archive/2013/03/06/2945468.html,不做纯粹的伸手党哦!