关于升级程序的关闭旧版本,运行新版本问题,请高手解答!

nanxun1027 2010-10-27 10:49:21
我做了一个升级程序,下载完新版本程序后,准备安装,运行以下这句话时,出现错误

System.Diagnostics.Process.Start(strName + "Update\\" + strVersion + "\\Debug\\setup.exe");

错误说明:已经安装了该产品的另一个版本。无法继续安装此版本。可以使用“控制面板”中“添加/删除程序”来配置或删除该产品现有版本。

我的想法是,不经过“添加/删除程序”,直接卸载旧版本,然后安装新版本。

开始用捕获进程的方式,然后kill(),结果杀死进程了,程序也终止了,没有运行新版本的安装文件,我应该怎么做呢?

请高手指点!
...全文
366 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Xzoth 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 weichangqing00 的回复:]

我用VS2005做的时候 打包程序的时候 有一个版本号的属性 和一个是否删除原有版本的属性(或者是是否被新版本替换的属性) 新版本打包的时候版本号属性要写一个不同的 和另一个属性 是true 就行了
直接安装新程序的时候 就会把原有程序删除的 你可以看一下
[/Quote]

6楼V5
weichangqing00 2010-10-27
  • 打赏
  • 举报
回复
我用VS2005做的时候 打包程序的时候 有一个版本号的属性 和一个是否删除原有版本的属性(或者是是否被新版本替换的属性) 新版本打包的时候版本号属性要写一个不同的 和另一个属性 是true 就行了
直接安装新程序的时候 就会把原有程序删除的 你可以看一下
沝林 2010-10-27
  • 打赏
  • 举报
回复
需要添加WindowsInstaller组件,添加以下引用:

using WindowsInstaller;
沝林 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nanxun1027 的回复:]
引用 1 楼 duanzilin 的回复:
要安装新版本,就必须卸载以前的版本,否则会造成混乱,解决方式如下:

出现“已经安装了该产品的另一个版本。无法继续安装此版本”错误,是因为相同ProductCode的安装包已经安装,因此制作新安装包的时候只需更改ProductCode就可以避免此错误;但是此时会同时安装两个版本的应用程序,要想在安装新版本时卸载以前版本,可以参考Updater Ap……
[/Quote]

如果是用VS打包的,那么setup.exe只是个引导程序,最终安装还是会执行msi安装文件,上面的代码是摘自Updater Application Block - Version 2.0源代码中,阐述如何删除已安装的旧版本,这里只有部分代码,要看全部内容,可以下载Updater Application Block V2自己研究下



/// <summary>
/// Helper method to remove a product from the local system.
/// </summary>
/// <param name="installer">Windows Installer 实例.</param>
/// <param name="productCode">需要卸载的product code.</param>
private void RemoveProduct( Installer installer, string productCode )
{
// 获取productCode对应产品的安装状态
MsiInstallState state = installer.get_ProductState( productCode );
// 如果已经被正常安装,就执行卸载
if ( state == MsiInstallState.msiInstallStateDefault )
{
Session session = null;
try
{
// 获取或设置安装参数
session = installer.OpenProduct( productCode );
session.set_Property( "REMOVE", "ALL");
session.DoAction( "INSTALL" );
}
finally
{
if ( session != null )
{
Marshal.ReleaseComObject( session );
}
}
}
}
zhangzhen_927116 2010-10-27
  • 打赏
  • 举报
回复
哇靠完全看不懂啊
nanxun1027 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 duanzilin 的回复:]
要安装新版本,就必须卸载以前的版本,否则会造成混乱,解决方式如下:

出现“已经安装了该产品的另一个版本。无法继续安装此版本”错误,是因为相同ProductCode的安装包已经安装,因此制作新安装包的时候只需更改ProductCode就可以避免此错误;但是此时会同时安装两个版本的应用程序,要想在安装新版本时卸载以前版本,可以参考Updater Application Block - Versi……
[/Quote]

请您写点注释吧,我有点看不懂,还有我是用exe安装的,msi这种更新可以用吗?

MsiInstallState这个命名空间,我在vs2010中没有看到啊,用不用加什么组件呢?
沝林 2010-10-27
  • 打赏
  • 举报
回复
要安装新版本,就必须卸载以前的版本,否则会造成混乱,解决方式如下:

出现“已经安装了该产品的另一个版本。无法继续安装此版本”错误,是因为相同ProductCode的安装包已经安装,因此制作新安装包的时候只需更改ProductCode就可以避免此错误;但是此时会同时安装两个版本的应用程序,要想在安装新版本时卸载以前版本,可以参考Updater Application Block - Version 2.0,里面有关于更新msi或者patch的示例
private void RemoveProduct( Installer installer, string productCode )
{
MsiInstallState state = installer.get_ProductState( productCode );
if ( state == MsiInstallState.msiInstallStateDefault )
{
Session session = null;
try
{
session = installer.OpenProduct( productCode );
session.set_Property( "REMOVE", "ALL");
session.DoAction( "INSTALL" );
}
finally
{
if ( session != null )
{
Marshal.ReleaseComObject( session );
}
}
}
}
wuyq11 2010-10-27
  • 打赏
  • 举报
回复
文件覆盖进行软件升级
File.WriteAllText("test.bat",
@"@echo off
:run
del %1 >nul
if exist %1 goto run
del test.bat
");
ProcessStartInfo p= new ProcessStartInfo();
p.FileName = "test.bat";
p.Arguments = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
p.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(p);
nanxun1027 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 duanzilin 的回复:]
需要添加WindowsInstaller组件,添加以下引用:

using WindowsInstaller;
[/Quote]

请教您一下,您说的组件是必须按照ApplicationUpdater2.msi吗?而这个ApplicationUpdater2东东又要求安装.Net Framework 1.1 框架,我现在是用vs2010编程的,应该是.Net Framework 4 框架,安装1.1说不兼容,我应该怎么做呢?下个.net Framework 3.5试试,您有单个的组件文件吗?我不知道这个是不是.dll文件啊?

您要是有现成的,给我发一份吧!我这比较着急,我的邮箱是mutounannan@126.com

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧