解决sqlite依赖无法打包单文件的问题

发布时间:2023-08-13

在一次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 目录中。

其他阅读

本地部署DeepSeek大模型服务

之前的文章介绍了怎么对接DeepSeek的API实现自己的助手,但是依旧使用的DeepSeek官方服务器,在高峰期还是会出现超长延时的情况,本文介绍另一种思路,通过在本机上部署DeepSeek大模型服务来告别卡顿崩溃。

查看原文

删除 Office 中毒瘤:Office Plus 插件

在某次更新之后,Office Plus 插件就会自动添加到 Word、Excel、PowerPoint 中,在我看来算是一个毒瘤,极大地拖慢了 Office 的运行,本文教大家怎么删除 Office Plus 这个毒瘤。

查看原文

Winform中设置控件边框

本文将会介绍在Winform中如何设置控件的边框,可应用于Form和Panel等。

查看原文

在ASP.NET Core中使用过滤器

ASP.NET Core是一个高性能的Web开发框架,过滤器(Filter)在ASP.NET Core中被用于路由方法之上,可以在路由方法执行前后完成一些额外的操作。本文将会介绍在ASP.NET Core中使用 IActionFilter 实现过滤器并读取路由方法中的参数。

查看原文

Top 命令输出

top 命令是 Linux 中一个很常用的命令,其作用是将系统的性能统计和进程运行情况输出到控制台中,本文带着大家解析 top 命令输出的内容具体作用。

查看原文