系列文章合集: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,作为内嵌的库来提供给软件使用