MSI之制作免输序列号安装包的方法

制作免输序列号安装包的方法可以分为以下步骤:

  1. 准备工具和文件
    首先需要准备MSI打包工具,我们推荐使用WiX Toolset来制作MSI安装包。除此之外,还需要准备产品安装文件(.exe、.msi或其他格式)、产品序列号、以及自定义的xml配置文件(可选)。

  2. 创建WiX项目
    使用WiX Toolset打开创建一个新的WiX项目,可以选择创建一个基本项目或添加模板。在项目文件夹中,创建一个Product.wxs文件,该文件的目的是定义项目的入口点,规定产品的全局属性、序列号信息、以及安装/卸载/更新的过程。

  3. 编写Product.wxs文件
    在Product.wxs文件中定义关键的属性信息,如产品名称,版本号,制造商,安装指向指南等。你还需要定义序列号的结构,然后将默认序列号替换为一个新的序列号,可以在xml配置文件中定义。如下所示:

<Package InstallerVersion="405" Compressed="yes" InstallScope="perMachine" InstallPrivileges="elevated" />

<Product Id="*" ...
         Name="$(var.ProductName)"
         Version="$(var.ProductVersion)"
         Manufacturer="$(var.Manufacturer)" >

    <MajorUpgrade AllowDowngrades="no" Schedule="afterInstallInitialize" />
    <MediaTemplate EmbedCab="yes" />
    <Property Id="ARPNOREMOVE" Value="yes" />
    <Property Id="ARPNOMODIFY" Value="yes" />

    <Property Id="PIDKEY" Value="XXXXX-XXXXX-XXXXX-XXXXX-XXXXX" />
    <UIRef Id="WixUI_Minimal" />

    <!-- ... -->
</Product>
  1. 添加自定义的xml配置文件
    添加一个自定义的xml配置文件,在其中定义序列号(LicenseKey)和其它相关信息。以下是一个例子(License.xml)。具体使用中,可以根据自己的需要修改或添加节点。
<Product>
  <LicenseCode>XXXXX-XXXXX-XXXXX-XXXXX-XXXXX</LicenseCode>
  <Language>en-US</Language>
  <InstallTo>System</InstallTo>
  <EULA>Acknowledgement of EULA after installation.</EULA>
  <Features>
    <Feature Name="Default" Selected="yes" />
  </Features>
</Product>
  1. 引入自定义的序列号配置文件
    在Product.wxs文件中加入PropertyRef节点,并为序列号属性指定默认值。如下所示:
<PropertyRef Id="WIXUI_INSTALLDIR" />
<PropertyRef Id="PIDKEY" />
<SetProperty Id="PIDKEY"
             Before="CostFinalize"
             Sequence="both"
             Value="[LicenseKey]" />

其中,WIXUI_INSTALLDIR引用了定义在UI.wxs(或其他的UI配置文件)中的安装目录属性,用来确保安装文件安装在正确的位置。

  1. 打包和测试
    最后,使用WiX Toolset进行打包。使用以下命令来创建MSI安装包:
candle.exe -dVersion=1.0 -dProductId=1234 Product.wxs License.xml

然后,使用light.exe进行编译和打包:

light.exe -ext WixUIExtension -sice:ICE20 -sice:ICE21 Product.wixobj License.wixobj -o ProductInstaller.msi

最后,对生成的安装包进行测试,确保安装过程中自动使用了预先设置好的序列号。测试过程可以手动模拟安装并验证序列号是否生效。

示例1:
产品更新时不更换已安装序列号,序列号信息来自于自定义的xml配置文件License.xml,其他属性信息来自于Product.wxs。

示例2:
产品新安装时主动提供序列号,序列号来自于用户输入后的文本框。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MSI之制作免输序列号安装包的方法 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#中Predicate与Func泛型委托的用法实例

    下面是关于“C#中Predicate与Func泛型委托的用法实例”的详细攻略。 1. 概述 在C#中,Predicate<T>与Func<T, bool>是两个重要的泛型委托类型。它们的主要作用是作为参数来传递一些特定的方法,来进行预测和筛选操作。 其中,Predicate<T>主要用于检索、查找等操作,它的定义如下: p…

    C# 2023年6月8日
    00
  • C#将数字转换成字节数组的方法

    要将一个数字转换成字节数组,我们可以使用C#中的BitConverter.GetBytes方法。该方法接受一个long,int,short,ulong,uint,ushort,double,float或decimal型式的数字,并将其转换为字节数组。 具体步骤如下: 使用BitConverter.GetBytes方法将数字转换为字节数组。例如: int nu…

    C# 2023年6月7日
    00
  • 使用.NET命令行编译器编译项目(如ASP.NET、C#等)

    使用.NET命令行编译器(通常是csc.exe)可以编译各种.NET项目,包括ASP.NET和C#等。下面是完整的攻略过程。 安装.NET Core SDK 首先,你需要安装.NET Core SDK,因为.NET命令行编译器是其中的一部分。你可以在官方网站上下载适用于你的操作系统的版本。安装完成后,你可以使用以下命令来检查.NET命令行编译器是否已经安装成…

    C# 2023年5月14日
    00
  • 使用Node.js实现HTTP 206内容分片的教程

    使用Node.js实现HTTP206内容分片的教程 HTTP206是一种HTTP状态码,表示服务器成功处理了部分GET请求。在某些情况下,我们需要将大文件分成多个部分进行传输,这就需要使用HTTP206内容分片。本文将介绍如何使用Node.js实现HTTP206内容分片。 步骤1:创建HTTP服务器 首先,我们需要创建一个HTTP服务器。可以使用Node.j…

    C# 2023年5月15日
    00
  • C#实现简单获取及设置Session类

    下面就是有关“C#实现简单获取及设置Session类”的详细攻略。 1. Session类的简介 ASP.NET Session对象是服务器端用来保存当前用户会话所需要的信息的一个对象,它的使用可以让我们在多个页面中共享数据,并且在不同的请求之间保持数据的一致性。Session类的主要作用有两个:一是用来存储用户端与服务器端会话信息,二是用来跟踪用户在整个网…

    C# 2023年6月6日
    00
  • c# 获取计算机硬件信息的示例代码

    这里提供一份C#获取计算机硬件信息的示例代码,可以使用System.Management命名空间中的ManagementObject类来获取计算机硬件信息。 步骤1:添加命名空间 首先,在代码文件中添加以下命名空间: using System.Management; 这个命名空间提供了可以获取WMI(Windows Management Instrument…

    C# 2023年5月31日
    00
  • C#实现的Win32控制台线程计时器功能示例

    接下来我将为您详细讲解“C#实现的Win32控制台线程计时器功能示例”的完整攻略。 一、简介 本示例将介绍如何使用C#实现的Win32控制台线程计时器功能,通过使用计时器函数实现计时器功能。控制台应用程序是在命令提示符下运行的应用程序,它不像GUI应用程序一样具有可见的用户界面,因此在控制台程序中使用计时器可以很好地控制时间和输出计时信息。 二、使用Win3…

    C# 2023年6月1日
    00
  • C#使用yield关键字让自定义集合实现foreach遍历的方法

    C#中的yield关键字可以帮助我们编写更加简单、优雅的代码,尤其是在需要进行集合遍历时。我们可以利用yield关键字来实现自定义集合的foreach遍历方法,这样我们就可以像使用系统集合一样使用我们自己的集合了。下面是一个完整的攻略,包含了具体步骤和示例说明。 准备工作 首先,我们需要在自定义集合类中添加一个GetEnumerator方法,该方法返回一个实…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部