visual studio 2012中的自定义操作(安装冲突问题) [英] custom actions in visual studio 2012(Setup conflicts problem)

查看:91
本文介绍了visual studio 2012中的自定义操作(安装冲突问题)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

朋友们,我想为我的一个MSI创建一个安装程序。 SQL localdb 2012,我写了这个:

Hello friends i wanted to create an installer for one of my MSIs. SQL localdb 2012, and i wrote this:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
using System.IO;
using System.Configuration.Install;
using System.Diagnostics;

namespace EXE
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            bool instalResult = false;
            timer1.Enabled = true;
            string strResult = "n";
            strResult=fncCheckRegistry();
            bool is64 = CheckCpuArcitecture();
            string appPath = Path.GetDirectoryName(Application.ExecutablePath);
            string strMsix86FileName = appPath + @"\x86\SqlLocaLDB.msi";
            string strMsix64FileName = appPath + @"\x64\SqlLocalDB_64.msi";
            //

            if (strResult != "y")
            {
                if (is64 == false)
                {
                    instalResult=fncInstal32(strMsix86FileName);
                }
            }
            if (strResult != "y")
            {
                if (is64 == true)
                {
                    instalResult = fncInstal32(strMsix64FileName);
                }
            }
            if (instalResult) timer1.Enabled = false;
            this.Close();
        }
        //
        public bool fncInstal32(string sMSIPath)
        {
            try
            {
                Console.WriteLine("Starting to install application");
                Process process = new Process();
                process.StartInfo.FileName = "msiexec.exe";
                process.StartInfo.Arguments = string.Format(" /qf /i \"{0}\" ALLUSERS=1  IACCEPTSQLNCLILICENSETERMS=YES", sMSIPath);
                process.Start();
                process.WaitForExit();
                Console.WriteLine("Application installed successfully!");
                return true; //Return True if process ended successfully
            }
            catch
            {
                Console.WriteLine("There was a problem installing the application!");
                return false;  //Return False if process ended unsuccessfully
            }
        }
        public bool CheckCpuArcitecture()
        {
            bool is64 = System.Environment.Is64BitOperatingSystem;
            return is64;
        }
        //
        public string fncCheckRegistry()
        {
            string strResult = "n";

            using (RegistryKey Key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server 2012 Redist\MSSQL11E.LOCALDB\1033\CurrentVersion"))
                if (Key != null)
                {

                    strResult= "y";
                }
                else
                {
                    strResult= "n";
                }

            return strResult;
        }
        bool x = false;
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (progressBar1.Value==100) x=true;
            if(!x) progressBar1.Value++;
            if (progressBar1.Value==0) x=false;
            if(x) progressBar1.Value--;
        }
    }
}





这会检查cpu Arcitecture以及我之前是否安装了msi。

问题从这里开始。

我在另一个安装项目中将此项目用作自定义操作中的exe。

在第二个安装项目中我安装.net框架4和Windows安装程序。

但我在设置的提交部分添加了自定义操作。

因此在第一次安装完成后(不完全完成)没有点击按钮)安装sql服务器的第二个设置将开始,但是经过两天思考我的问题后我多么不走运它警告我有两个设置一起工作!!!

什么应该我做朋友吗?你有什么建议吗?

如何在安装结束时关闭基本卸载程序并打开另一个进程?



This checks cpu Arcitecture and if my msi is installed before.
the problem begins here.
I used this project as an exe in custom actions in a another setup project.
in the second setup project i install .net framework 4 and windows installer.
but i added custom action in the commit part of the setup.
So after the first installation finished(not completely the finish button is not clicked) the second setup that install sql server will begin, but how unlucky i am after two days of thinking on my problem it warns me about having two setup working together!!!
What should i do friends? do you have any suggestion?
How can i close the base uninstaller at the end of installation and open another process?

推荐答案

我有找到我的答案:



我们创建了一个安装程序类,我们在其中写下:



< br $> b $ b





I have find my answer:

Well we create an installer class and we write this in it:





using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;


namespace OpenWeb
{
    [RunInstaller(true)]

    public partial class Installer1 : System.Configuration.Install.Installer
    {
        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Install(IDictionary stateSaver)
        {
            base.Install(stateSaver);
        }

        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Commit(IDictionary savedState)
        {
            base.Commit(savedState);
            System.Diagnostics.Process.Start(Context.Parameters["TARGETDIR"].ToString() + "Exe.exe");
            // Very important! Removes all those nasty temp files.
            base.Dispose();
        }

        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Rollback(IDictionary savedState)
        {
            base.Rollback(savedState);
        }

        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Uninstall(IDictionary savedState)
        {
            base.Uninstall(savedState);
        }

        public Installer1()
        {
            InitializeComponent();
        }
    }
}





然后我们创建我们的设置并添加我们的exe文件和我们通过添加主输出来添加安装程序类。

现在我们通过添加主输出在提交和安装中添加自定义操作。

现在我们添加/ TARGETDIR = [TARGETDIR] \到我们的安装和提交部分的自定义操作数据。

现在我们构建我们的设置。

享受



then we create our setup and we add our exe file and we add the installer class by adding primary output.
now we add custom action in commit and install by adding primary output there too.
now we add this /TARGETDIR="[TARGETDIR]\" to our custom action data for both of install and commit part.
now we build our setup.
Enjoy


这篇关于visual studio 2012中的自定义操作(安装冲突问题)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆