使用 MSIX 打包 DotNetCore 3.0 客户端程序

如何你希望你的 WPF 程序能够以 Windows 的保护机制保护起来,不被轻易反编译的话,那么这篇文章应该能帮到你。

介绍#

MSIX 是微软于去年的 Windows 开发者日峰会 上推出的全新应用打包解决方案。其目的是取代旧式的软件打包方式,可用于 Win32、WindowsForm 、 WPF 和 UWP 等应用程序,该打包方式将支持 Windows7 和 Windows8.x。并且让我们的程序不会轻易反编译。

本文,我们将尝试如何使用 MSIX 来打包我们的 DotNetCore 3.0 WPF 应用程序。

使用#

我们打开 VS2019,新建一个基于 DotNetCore 3.0 的 WPF 项目。当然,你也可以使用 CLI 来进行创建,命令为 dotnet new wpf

接着,我们在当前的解决方案中创建一个 Windows Application Packaging Project 项目,如下图所示:

然后,设置我们的项目名称,如下图所示:

最后,点击 crate 。此时会弹出一个窗口,让你选择你的程序包运行的目标版本和最低版本,这里我们按需选择即可,我的选择如下图所示:

项目创建完毕后,项目中会有如下文件:

  • xxx.pfx:程序包证书,这个对于每个发布包都是必须的;
  • Package.appxmanifest:程序包的一些信息,包括应用程序的设置、系统权限访问的控制等,双击该文件可以进行设置;

熟悉 UWP 开发的朋友应该对这个项目内容都很熟悉了,这里就不做过多解释。

右键当前项目的 Application 项,然后会有一个 Add Reference 选项卡,点击它,此时会出来一个列表,列出当前解决方案中,我们可进行打包发布的项目,如下图所示:

这里,我们就选择我们之前创建的一个 WPF 项目 WPF1,对它进行打包。

进行上述操作之后,我们可以尝试右键该项目,选择 Build 操作,如果不出意外的话,会出现如下图的错误:

由于 MSIX 目前仅支持 DotNetCore 3.0 Self-Contained 的方式进行打包,这意味发布的包不仅包含我们的应用程序,还会包含完整的 .NET Core 运行时。这种方式可能会使我们的包更大,但是更显著的优点是我们可以部署到任何机器上,无论目标机器是否安装了 .NET Core 3.0 的运行时,尤其是当你打算将你的程序通过 Microsoft Store 进行分发。所以我们需要解决上述说的问题。

右键我们的主程序项目解决方案文件 XX.csproj,在 PropertyGroup 节点下添加一个 RuntimeIdentifiers 节点,如下所示:

Copy
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UseWPF>true</UseWPF> <!--添加如下节点-->
<RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
</PropertyGroup> </Project>

修改完毕后,重新编译我们的主程序。然后再选择我们的打包程序,右键执行 Deploy,可以成功的将我们的主程序部署到我们的自己机器上。

此外,我们可以右键打包程序,点击 Store 选项卡中的 Create App Packages。如下图所示:

这里为我们的应用程序选择 x64 架构。然后执行 Create 即可。如果一切正常的话,会生成一个发布目录。会出现如下图所示的界面:

注:我们要依据我们的目标平台来选择正确的架构方式。如果执行失败,请确保你的架构方式选择正确,不要选择 Neutral 方式。

到时候,我们只需要将我们的这个发布目录发布给目标用户即可,同时,我们也可以将我们应用发布到应用商店。

总结#

众所周知,传统 WPF 程序如何直接打包发布时很容易被反编译的。我们希望我们的软件能够被保护起来,不那么被反编译,所以可以使用 MSIX 可以尝试一下。

使用 MSIX 是一种更安全有效的发布方式,能够确保我们的应用程序和客户系统更加安全。这种方式的部署能将我们的应用程序以沙箱的方式运行,所以安装和卸载都很干净,不会出现各种反三观的 流氓行为,如果我们的应用不走商店分发的话,我们也可以将我们的程序包发给用户,然后通过使用微软在应用商店提供的打包工具 MSIX Packaging Tool 来进行安装我们的应用程序,同样合适很方便的。

此外,我们也可以使用它来更新我们已经发布的应用程序,感兴趣的朋友可以参考文末相关链接,这里就不做介绍了。

相关参考#

MSIX 打包 DotNetCore 3.0的更多相关文章

  1. 使用 MSIX 打包 DotNetCore 3.0 客户端程序

    如何你希望你的 WPF 程序能够以 Windows 的保护机制保护起来,不被轻易反编译的话,那么这篇文章应该能帮到你. 介绍 MSIX 是微软于去年的 Windows 开发者日峰会 上推出的全新应用打 ...

  2. 创建或打开解决方案时提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案

    提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案: 1.检查是否有C:\Program Files (x86)\d ...

  3. 解决 DotNetCore.1.0.1-VS2015Tools.Preview2.0.3.exe 在VS2015 Update3 安装失败的问题

    今天抽空升级VS2015 Update3. 在安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.3.exe 时报错了,看了错误日志 显示: 看到我标红的两个地方,那么 ...

  4. 无法安装 DotNetCore.1.0.0-VS2015Tools.Preview2解决方法

    安装 DotNetCore.1.0.0-VS2015Tools.Preview2,已经安装vs2015update3,还是提示检测到 Visual Studio 2015 Update 3没有完全安装 ...

  5. [转] 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2出现0x80072f8a未指定的错误

    原文地址:安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2出现0x80072f8a未指定的错误 最近DotNetCore更新到了1.0.1,Azure tools ...

  6. 安装DotNetCore.1.0.0-VS2015Tools.Preview2失败解决方案

    1.把安装文件放入非系统盘 2.命令行带参数运行: DotNetCore.1.0.0-VS2015Tools.Preview2.0.1.exe SKIP_VSU_CHECK=1 或 DotNetCor ...

  7. 将传统 WPF 程序迁移到 DotNetCore 3.0

    介绍 由于历史原因,基于 Windows 平台存在着大量的基于 .NetFramework 开发的 WPF 和 WinForm 相关程序,如果将这些程序全部基于 DotNetCore 3.0 重写一遍 ...

  8. DotNetCore 3.0 助力 WPF 开发

    DotNetCore Is AnyWhere. 前言 Visual Studio 2019 已经正式发布了,DotNetCore 3.0 的正式版也指日可待.在之前的版本中,作为一名基于微软生态的传统 ...

  9. vs2015 iis express启动不了及安装DotNetCore.1.0.0-VS2015Tools.Preview2失败的解决方法

    直接用管理员账户打开cmd,进入exe所在的文件夹在运行命令DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1不要加引号. PS:如果 ...

随机推荐

  1. Acwing-285-没有上司的舞会(树型DP)

    链接: https://www.acwing.com/problem/content/287/ 题意: Ural大学有N名职员,编号为1~N. 他们的关系就像一棵以校长为根的树,父节点就是子节点的直接 ...

  2. HZOJ 20190727 随(倍增优化dp)

    达哥T1 实际上还是挺难的,考试时只qj20pts,还qj失败 因为他专门给出了mod的范围,所以我们考虑把mod加入时间复杂度. $50\%$算法: 考虑最暴力的dp,设$f[i][j]$表示进行$ ...

  3. docker命令集锦

    sudo docker image ls 查看有哪些image镜像sudo docker run hello 运行image 删除全部containerdocker rm $(docker conta ...

  4. TensorFlow使用记录 (十二): ℓ1 and ℓ2 Regularization

    实现方式 以 ℓ2 Regularization 为例,主要有两种实现方式 1. 手动累加 with tf.name_scope('loss'): loss = tf.losses.softmax_c ...

  5. 【IOI2018】机械娃娃

    看到的时候感到很不可做,因为所有的开关都要状态归零.因此可以得到两分的好成绩. --然后 yhx-12243 说:这不是线段树优化建图吗? 于是我获得了启发,会做了-- 还不是和上次一样,通过提示做出 ...

  6. Android蓝牙通信

    Android为蓝牙设备之间的通信封装好了一些调用接口,使得实现Android的蓝牙通信功能并不困难.可通过UUID使两个设备直接建立连接. 具体步骤: 1. 获取BluetoothAdapter实例 ...

  7. SRS之信号的管理:SrsSignalManager

    1. 综述 SRS 中使用了 State Threads 协程库,该库对信号的处理是将信号事件转换为 I/O 事件.主要做法是:对关注的信号设置同样地信号处理函数 sig_catcher(),该函数捕 ...

  8. laravel查询构造器DB还是ORM,这两者有什么区别,各该用在什么场景中

    解答一: 我们所有操作都是走的orm,因为操作简单 直观明了 好维护,性能是低一些 但还没有多致命,真有并发需要优化了 用DB也不一定能解决问题.还是要了解orm每个方法的意思,不然你可能一不小心就会 ...

  9. vue事件.navtive 的使用

    我们可以直接在组件标签上绑定事件了 然后在 methods 的对象中调用这个方法了 正常情况下是不可以的,但是我们可以使用事件修饰符 .navtive 就可以实现了 props的对象写法

  10. linux系统空间不足,lsof看到异常的delete状态的文件。

    #20191101更新---这篇文章适用于产生僵尸文件的进程是可kill的状态参考,就是这个进程死亡不影响业务,那么另外一种情况,也是我现在管理的项目中生产环境中出现过的情况,产生僵尸文件的进程是we ...