weigan
发布于 2024-08-09 / 57 阅读
0
0

使用WixSharp将你的Solidworks插件打包

WixSharp🛠️

在使用前我们先了解一下什么是Wix和WixSharp是什么。

Wix(Windows Installer XML)

Wix 是一个开源的工具集,用于创建Windows安装程序包(MSI文件)。它使用XML文件来定义安装包的结构和内容。Wix提供了一系列命令行工具,用于编译和链接这些XML文件,从而生成一个可执行的Windows安装包。

Wix的主要特点包括:

  1. 开源和免费:Wix是一个完全开源的项目,任何人都可以免费使用。

  2. 灵活性:使用XML文件定义安装程序的结构,可以高度定制安装过程。

  3. 集成:Wix可以很好地集成到现有的开发工具链中,例如MSBuild、Visual Studio等。

  4. 强大的功能:支持复杂的安装场景,包括自定义操作、条件安装、升级、修补等。

WixSharp

WixSharp 是一个基于Wix的C#库,它使得使用C#代码来定义和生成Wix安装包成为可能。WixSharp简化了Wix的使用,提供了一种更加直观和易于使用的方式来创建安装程序,而无需手动编写XML文件。

WixSharp的主要特点包括:

  1. 简化的语法:使用C#代码而不是XML来定义安装包,使得开发人员可以利用熟悉的编程语言来编写安装逻辑。

  2. 强大的功能:尽管简化了语法,WixSharp仍然保留了Wix的强大功能,可以处理复杂的安装场景。

  3. 集成:可以轻松集成到C#项目中,并与Visual Studio无缝配合

  4. 可扩展性:可以利用C#的强大功能来编写自定义操作和逻辑,扩展安装包的功能。

准备工作📝

  • Visual Studio (Rider 也可以)

  • Solidworks插件项目

安装WixSharp模板(可跳过,不建议)

WixSharp 项目本质是一个控制台项目,Visual Studio的模板可以提供很多预设,如果你对WixSharp比较熟悉,也可以从新建控制台项目开发,而不必要安装此扩展。

如果这里无法下载安装,可以访问此链接在网页下载完成后安装。

创建WixSharp项目🚀

  • 新建一个 WixSharp Steup(Wix3) 的项目

  • 项目名称命名为 Installer

编写安装包生成代码💻


internal class Program
{
    const string ProductName = "SolidworksURDFExporter"; // 产品名称
    const string CompanyName = "Ros"; // 公司名称
    const string ProductId = "6B987FA1-EBB0-4C20-BA70-ED4B9A11B5A6"; // 产品ID
    const string OutputDir = "output"; // 安装包生成路径
    const string Manufacturer = "https://github.com/weianweigan/solidworks_urdf_exporter"; // 产品Url
    const string HelpLink = "https://github.com/weianweigan/solidworks_urdf_exporter"; // 帮助连接
    const string InstallationDir = $@"%ProgramFiles%\{CompanyName}\{ProductName}"; // 默认安装路径

    static void Main()
    {
        string BinaryDir = GetBinDir(); // 打包的文件路径
        Console.WriteLine($"Binary directory: {BinaryDir}");
        string Version = GetVersion(); // 控制安装包版本
        Console.WriteLine($"Version: {Version}");
        string FileName = $"{ProductName}-{Version}";

        var project = new Project(
            ProductName,
            new InstallDir(InstallationDir, GetWixEntities(BinaryDir)),
            new ElevatedManagedAction(
                CustomActions.InstallServer,
                Return.check,
                When.After,
                Step.InstallFiles,
                Condition.NOT_Installed
            ),
            new ElevatedManagedAction(
                CustomActions.UnInstallServer,
                Return.check,
                When.Before,
                Step.RemoveFiles,
                Condition.BeingUninstalled
            )
        )
        {
            OutDir = OutputDir,
            Platform = Platform.x64,
            UI = WUI.WixUI_InstallDir,
            Version = new Version(Version),
            OutFileName = FileName,
            InstallScope = InstallScope.perMachine,
            InstallPrivileges = InstallPrivileges.elevated,
            MajorUpgrade = MajorUpgrade.Default,
            GUID = new Guid(ProductId),
            // BackgroundImage = @"Resources\Icons\BackgroundImage.png", // 图片需要把图片放置在此路径, 大小为494x312
            // BannerImage = @"Resources\Icons\BannerImage.png", // 图片需要把图片放置在此路径, 大小为493x58
            ControlPanelInfo =
            {
                Manufacturer = Manufacturer,
                HelpLink = HelpLink,
                Comments = ProductName,
                // ProductIcon = @"Resources\Icons\ShellIcon.ico" // 图片需要把图片放置在此路径,控制面板图标
            },
            ValidateBackgroundImage = false,
        };
        project.RemoveDialogsBetween(NativeDialogs.WelcomeDlg, NativeDialogs.InstallDirDlg);

        project.BuildMsi();
    }

    static string GetVersion() => typeof(Program).Assembly.GetName().Version.ToString();

    static string GetBinDir()
    {
        var dir = Path.GetDirectoryName(typeof(Program).Assembly.Location);

        while (!Directory.GetDirectories(dir).Any(p => p.EndsWith(".git")))
        {
            dir = Directory.GetParent(dir).FullName;
        }

        return Path.Combine(dir, "SW2URDF", "bin",
#if DEBUG
            "Debug"
#else
            "Release"
#endif
        );
    }

    static WixEntity[] GetWixEntities(string binaryDir)
    {
        return
        [
            new Files($@"{binaryDir}\*.*"),
            new Dir(
                $@"%ProgramMenu%\{CompanyName}\{ProductName}",
                new ExeFileShortcut(
                    $"UnInstall {ProductName}",
                    "[System64Folder]msiexec.exe",
                    $"/x [ProductCode]"
                )
            )
        ];
    }
}

public class CustomActions
{
    [CustomAction]
    public static ActionResult InstallServer(Session session)
    {
        return session.HandleErrors(() =>
        {
            string batFile = Path.Combine(session.Property("INSTALLDIR"), "Install.bat");
            var p = Process.Start(batFile);
            p.WaitForExit();
        });
    }

    [CustomAction]
    public static ActionResult UnInstallServer(Session session)
    {
        return session.HandleErrors(() =>
        {
            string batFile = Path.Combine(session.Property("INSTALLDIR"), "UnInstall.bat");
            var p = Process.Start(batFile);
            p.WaitForExit();
        });
    }
}

这里用到了两个脚本文件 Install.batUnInstall.bat 来注册和卸载程序集,需要将这两个文件和RegAsm.exe这三个文件放置你的打包目录。

set path=%~d0
cd %path%
cd /d %~dp0

RegAsm.exe SW2URDF.dll /codebase
set path=%~d0
cd %path%
cd /d %~dp0

RegAsm.exe SW2URDF.dll /u

生成安装包📦

这时候,编译Installer项目就会生成安装包,如果不想编译就生成 <PackageReference Include="WixSharp.bin" Version="1.25.2" /> 包卸载。

参考项目📚

可以参考一下项目创建你的安装包生成项目。

weianweigan/solidworks_urdf_exporter: SolidWorks to URDF Exporter (github.com)

相关链接🔗


评论