解决sqlite依赖无法打包单文件的问题
在一次WPF开发中,选用了sqlite作为内嵌数据库,使用 ystem.Data.SQLite
库来调用,在使用 Fody 进行单文件打包时,发现打包文成后会出现 x86 和 x64 两个特定的文件夹,分别对应着32位和64位的 SQLite.Interop.dll
,本文介绍修改项目文件来实现将 sqlite 通信库一起打包成单文件的方法。
配置
打开对应的项目文件(.csproj),对于.net framework 的项目可能需要用外部编辑器打开,加入对应的编译配置项。
<Target Name="EmbedSQLiteInteropFiles" BeforeTargets="ResolveReferences">
<ItemGroup>
<!-- Condition on item metadata trick adapted from https://stackoverflow.com/questions/5103026/in-msbuild-can-i-use-the-string-replace-function-on-a-metadata-item/8904902#8904902 -->
<EmbeddedResource Include="@(SQLiteInteropFiles)">
<!-- Syntax could be simplified in the future in MSBuild, see [Metadata should support instance methods](https://github.com/microsoft/msbuild/issues/1155) -->
<Link Condition="$([MSBuild]::ValueOrDefault('%(Identity)', '').Contains('x86'))">costura32\%(Filename)%(Extension)</Link>
<Link Condition="$([MSBuild]::ValueOrDefault('%(Identity)', '').Contains('x64'))">costura64\%(Filename)%(Extension)</Link>
</EmbeddedResource>
</ItemGroup>
</Target>
它的工作原理如下:
将 CopySQLiteInteropFiles
设置为 false
可防止将 x86 和 x64 目录复制到输出目录中。我们不需要复制它们,因为它们将由 Costura
嵌入。
System.Data.SQLite.Core
NuGet 包有一个定义 SQLiteInteropFiles
项组的 *.targets
文件。我们使用此项目组来定义 EmbeddedResource
项目组。然后,借助 MSBuild,我们将 SQLite.Interop.dll
嵌入到 costura32 和 costura64 目录中。