How to include version number in VS Setup Project output filename

前端 未结 6 1260
既然无缘
既然无缘 2020-12-08 04:58

Is there a way to include the version number as part of the output.msi filename in a VS2008 Setup Project?

I\'d like for example an output file called: \"myinstall

6条回答
  •  佛祖请我去吃肉
    2020-12-08 05:42

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using WindowsInstaller;
    
    
    // cscript //nologo "$(ProjectDir)WiRunSql.vbs" "$(BuiltOuputPath)" "UPDATE `Property` SET `Property`.`Value`='4.0.0.1' WHERE `Property`='ProductVersion'"
    // "SELECT `Property`.`ProductVersion` FROM `Property` WHERE `Property`.`Property` = 'ProductVersion'"
    
    /* 
     * That's a .NET wrapper generated by tlbimp.exe, wrapping the ActiveX component c:\windows\system32\msi.dll.  
     * You can let the IDE make one for you with Project + Add Reference, COM tab, 
     * select "Microsoft Windows Installer Object Library". 
     */
    namespace PostBuildEventModifyMSI
    {
        /* Post build event fro Rename MSI file.
         * $(SolutionDir)PostBuildEventModifyMSI\bin\Debug\PostBuildEventModifyMSI.exe "$(SolutionDir)TestWebApplicationSetup\Debug\TestWebApplicationSetup.msi"
         */
    
        [System.Runtime.InteropServices.ComImport(), System.Runtime.InteropServices.Guid("000C1090-0000-0000-C000-000000000046")]
        class Installer { }
        class Program
        {
            static void Main(string[] args)
            {
                #region New code.
    
                string msiFilePath = string.Empty;
                if (args.Length == 0)
                {
                    Console.WriteLine("Enter MSI file complete path:");
                    msiFilePath = Console.ReadLine();
                }
                else
                {
                    Console.WriteLine("Argument Received args[0]: " + args[0]);
                    msiFilePath = args[0];
                }
    
                StringBuilder sb = new StringBuilder();
                string[] words = msiFilePath.Split('\\');
                foreach (string word in words)
                {
                    sb.Append(word + '\\');
    
                    if (word.Contains("Debug"))
                    {
                        break;
                    }
                    else
                    {
    
                    }
                }
    
                // Open a view on the Property table for the Label property 
                //UPDATE Property set Value = '2.06.36' where Property = 'ProductVersion'
                Program p = new Program();
                string version = p.GetMsiVersionProperty(msiFilePath, "ProductVersion");
                string productName = p.GetMsiVersionProperty(msiFilePath, "ProductName");
    
                string newMSIpath = sb.ToString() + string.Format("{0}_{1}.msi", productName, version);
                Console.WriteLine("Original MSI File Path: " + msiFilePath);
                Console.WriteLine("New MSI File Path: " + newMSIpath);
    
    
                System.IO.File.Move(msiFilePath, newMSIpath);
    
                #endregion
    
    
    
    
                //Console.Read();
            }
    
            private string GetMsiVersionProperty(string msiFilePath, string property)
            {
                string retVal = string.Empty;
    
                // Create an Installer instance  
                WindowsInstaller.Installer installer = (WindowsInstaller.Installer) new Installer();
    
                // Open the msi file for reading  
                // 0 - Read, 1 - Read/Write  
                Database db = installer.OpenDatabase(msiFilePath, WindowsInstaller.MsiOpenDatabaseMode.msiOpenDatabaseModeReadOnly); //// Open the MSI database in the input file 
    
                // Fetch the requested property  
                string sql = String.Format(
                    "SELECT Value FROM Property WHERE Property='{0}'", property);
                View view = db.OpenView(sql);
                //View vw = db.OpenView(@"SELECT `Value` FROM `Property` WHERE `Property` = 'ProductVersion'");
                view.Execute(null);
    
                // Read in the fetched record  
                Record record = view.Fetch();
                if (record != null)
                {
                    retVal = record.get_StringData(1);
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(record);
                }
                view.Close();
    
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(view);
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(db);
    
                return retVal;
            }
    
        }
    }
    

提交回复
热议问题