IoT Power PC 端技术总结 – 1 WPF单文件化

系列文章合集:IoT Power PC 端技术总结

单文件化的取舍

实际上对于现在的大部分软件来说,不需要做单文件化,因为基本都是一个安装包来把软件安装到固定位置,这时软件有多少文件并不是个重要的事情。
但是缺点也比较明显,如果你在公司内想把软件分享给同事,可能就需要重新找到你之前使用的安装包才可以。
如果软件本体是单文件化的,那么在分享时可以直接分享软件的exe即可。

同时单文件化的缺点也显而易见:
打包是个难题,尤其是当你引用了一大堆库的时候,单文件化就会比较痛苦。
同时由于你的软件可能会被用户放置在任何可能的文件夹内,这时候就必须保证软件本体兼容中文路径。
软件升级也是类似的问题,由于用户路径不同导致的权限、路径编码处理问题也会相当多,这一点后面的文章再讨论。

.net framework托管库的打包

整个单文件化的过程实际上都是调库实现的,我们需要安装一个nuget包:Costura.Fody

PM> NuGet\Install-Package Costura.Fody -Version 5.7.0

装完后你什么都不用配置,直接尝试编译就会发现,你的软件只剩下一个光秃秃的exe,你引用的其他库生成的dll会被它自动处理打包。

非托管库的打包

有些软件会引用一些非托管库,比如IoT Power工程就引用了lua和自己编写的rust数据处理库,通常这类库都是以dll形式提供,并且需要区分x86和x64,打包这种库就需要手动指定一下了

首先我们要准备好对应的dll,再项目下新建两个文件夹:

  • costura32
  • costura64

两个文件夹

把x86的dll放入文件夹costura32,把x64的dll放入文件夹costura64

在vs中分别选中每个dll,在下方属性中将生成操作更改为嵌入的资源,每个dll都要这样操作

属性

如果尝试过上面的步骤,进行过编译,可能会在工程目录生成一个FodyWeavers.xml,如果没有生成的话可以手动新建一个,在文件中我们写上对应的dll文件名(不带末尾的dll拓展名)

<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
  <Costura>
    <Unmanaged32Assemblies>
        rust_data
        xlua
    </Unmanaged32Assemblies>
    <Unmanaged64Assemblies>
        rust_data
        xlua
    </Unmanaged64Assemblies>
  </Costura>
</Weavers>

这样Costura.Fody就会帮我们把指定的dll,作为内嵌的库来提供给软件使用

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注