zoukankan      html  css  js  c++  java
  • .Net 5下的单文件部署

    由于.net程序没有静态链接,一直缺乏单文件部署这种干净的发布方案。对客户端程序发布并不是很友好。在之前的.net framework下,有ILMerge合并程序集,以及LibZ的嵌入资源文件等第三方的解决方案。在.net core 3中,官方提供了一个单文件部署方案,不过这种方式是生成一个自解压程序,运行时将程序集解压到临时目录中,然后再运行程序。严格意义上是一个伪单文件方案,有的地方也有一些坑。

    在.Net 5中,对单文件部署进行了进一步增强,可以直接运行代码,而无需从应用中提取文件。本文在这里进行一些简单的介绍。

    传统的发布方式

    首先看下传统的发布方式:dotnet publish

    这种方式下,生成的文件比较小,需要安装runtime才能运行。生成的文件除了exe外,还有一个dll和两个json文件。

    除了这种方式外,也有一种不依赖runtime的独立部署的方式,指定目标运行时即可:dotnet publish -r win-x64。

    这种方式会携带几十个程序集,看着非常不舒服。

    .Net 5的单文件部署

    .Net 5下单文件发布的参数是/p:PublishSingleFile=true,它可以和其它几个参数组合,有如下几种单文件发布的方案。 

      1. 依赖于Framework

     dotnet publish -r win-x64 --self-contained=false /p:PublishSingleFile=true

    这种方式和传统的发布方式非常类似,不过更加简单,没有json文件和dll文件。虽然也需要runtime,但在安装了runtime的情况下,是可以只有一个exe就可以运行的。

      2. 不依赖Framework

    dotnet publish -r win-x64 /p:PublishSingleFile=true

    和前面的方式相比,少了--self-contained=false参数,它生产的文件是包含运行程序集的,所以比较大。但可以不需要安装runtime即可运行。对于程序过大这一点,微软也提供了一个/p:PublishTrimmed=true 参数裁剪掉没有用到的程序集。

    裁剪完了后只有10mb了,看着就好多了。此时会提示裁剪可能会改变程序行为,需要经过详细测试。 

      3. 包含Native dll的单文件发布

    前面的方式中,还是包含着四个系统相关的dll的(coreclr.dll, clrjit.dll, clrcompression.dll, mscordaccore.dll),这几个dll是系统原生的native dll(在不同的系统上不一样)。.net core程序运行的时候是依赖着这几个native dll的,他们无法和.net 程序集合并。

    对于这个问题,微软提供了一个将这几个dll也给打包的参数:/p:IncludeNativeLibrariesForSelfExtract=true 使得可以生成更加干净的单文件模式。不过,这个方案是一个自解压的程序。虽然.net程序集已经合并了,但是和native的程序是以嵌入的方式混合在一起的,使用的时候,依然是先释放这几个native dll才运行的。

    在GUI中配置单文件发布

    在新版的visual studio中(目前是 16.8),已经有对单文件的发布的gui支持了,用起来也是非常方便的。

      

    注意事项

    单文件发布时,也是有一些需要注意的事项的,例如:如何指定某些程序集不合并发布,单文件发布后一些和路径相关的api的发生的变化等。这里就不一一列举了,感兴趣朋友可以参考下围绕的官方文档单文件部署和可执行文件

    参考文章

  • 相关阅读:
    如何去除文件的打开方式,恢复默认打开方式如何消除默认打开方式
    vbs和qtp一些脚本
    忘记oracle用户名密码怎么办?
    网关
    子网掩码的作用和设置方法
    三层交换机配置说明(华为S5700设置三个网段互通)
    QTP连接MYSQL数据库方法
    批量创建IP方法
    MongoDB中的一些坑( 2.4.10 版本)
    java的BASE64Encoder,BASE64Decoder加密与解密
  • 原文地址:https://www.cnblogs.com/TianFang/p/13768386.html
Copyright © 2011-2022 走看看