Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用.NET框架上的SQLite EF核心数据库提供程序打包单个文件的可执行文件?

如何使用.NET框架上的SQLite EF核心数据库提供程序打包单个文件的可执行文件?
EN

Stack Overflow用户
提问于 2020-09-14 15:50:22
回答 1查看 273关注 0票数 1

我想写一个使用SQLite Entity Framework Core Database Provider的应用程序,将其打包为单文件可执行文件(即没有任何.dll文件的单个exe文件),并使其在.NET框架4.7.2上运行。

这是可能的吗?如果是,是如何实现的?

EN

回答 1

Stack Overflow用户

发布于 2020-09-14 15:50:22

是的,这是可能的,但它涉及到大量的工作,无论是在构建时还是在运行时。

首先,您必须使用Costura Fody add-in将引用嵌入为资源。将以下内容添加到您的csproj文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ItemGroup>
    <PackageReference Include="Costura.Fody" Version="4.1.0" />
</ItemGroup>

这样做将自动打包主可执行文件中的所有all,并在运行时加载它们。对于托管dlls来说,一切都是开箱即用的,但本机dlls需要做更多的工作。如果我们将本机库嵌入到名为costura32costura64的目录中,Costura可以负责预加载本机库。通过一些MSBuild魔术,我们可以嵌入SQLitePCLRaw.lib.e_sqlite3提供的原生sqlite dll(它是Microsoft.EntityFrameworkCore.Sqlite包的间接依赖项):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ItemGroup>
    <PackageReference Include="SQLitePCLRaw.lib.e_sqlite3" Version="2.0.4" GeneratePathProperty="true" />
</ItemGroup>

<Target Name="EmbedNativeSQLiteDllWithCostura" BeforeTargets="ResolveAssemblyReferences">
    <ItemGroup>
        <EmbeddedResource Include="$(PkgSQLitePCLRaw_lib_e_sqlite3)\runtimes\win-x86\native\e_sqlite3.dll">
            <Link>costura32\e_sqlite3.dll</Link>
            <Visible>false</Visible>
        </EmbeddedResource>
        <EmbeddedResource Include="$(PkgSQLitePCLRaw_lib_e_sqlite3)\runtimes\win-x64\native\e_sqlite3.dll">
            <Link>costura64\e_sqlite3.dll</Link>
            <Visible>false</Visible>
        </EmbeddedResource>
        <Content Remove="@(Content)" Condition="'%(Filename)%(Extension)' == 'e_sqlite3.dll'" />
        <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(Filename)%(Extension)' == 'e_sqlite3.dll' OR '%(Filename)%(Extension)' == 'SQLitePCLRaw.batteries_v2.dll'" />
    </ItemGroup>
</Target>

让我们把它分解一下。

首先,我们需要一个显式的指向GeneratePathProperty="true"SQLitePCLRaw.lib.e_sqlite3PackageReference,这样我们就可以访问本地sqlite dll路径。

然后,我们将x86和x64本地库嵌入到costura32costura64中,以便Costura在启动时自动加载它们(甚至在调用Main函数之前)。

我们还需要从Content项中删除e_sqlite3.dll文件,否则所有本机all都将复制到输出目录中。我们不需要在输出目录中使用它们,因为我们将使用嵌入式文件。

最后,我们需要从ReferenceCopyLocalPaths项中删除e_sqlite3.dllSQLitePCLRaw.batteries_v2.dll,这样它们就不会嵌入到Costura资源中。e_sqlite3.dll是一个本地库,我们已经嵌入了它。不能嵌入SQLitePCLRaw.batteries_v2.dll,因为我们将编写自己的SQLitePCLRaw初始化器,并且我们不希望EF Core运行默认的Batteries_V2.Init()初始化器。

这就是构建部分。现在让我们看看在运行时必须做些什么。

因为我们阻止了SQLitePCLRaw.batteries_v2.dll被Costura嵌入,所以默认的初始化器will not run (Assembly.Load将返回null)。因此,在使用SqliteConnection之前,我们必须使用configure a SQLite provider。我们将重用SQLite3Provider_dynamic_cdecl (来自SQLitePCLRaw.provider.dynamic_cdecl包),并使用我们自己的IGetFunctionPointer接口实现来配置它。我们的实现搜索由Costura自动加载的当前进程的e_sqlite.dll模块,并使用来自SQLitePCLRaw的NativeLibrary.TryGetExport方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using SQLitePCL;

public class ModuleGetFunctionPointer : IGetFunctionPointer
{
    private readonly ProcessModule _module;

    public static ProcessModule GetModule(string moduleName)
    {
        var modules = Process.GetCurrentProcess().Modules.Cast<ProcessModule>().Where(e => Path.GetFileNameWithoutExtension(e.ModuleName) == moduleName).ToList();
        if (modules.Count == 0)
        {
            throw new ArgumentException($"Found no modules named '{moduleName}' in the current process.", nameof(moduleName));
        }
        if (modules.Count > 1)
        {
            throw new ArgumentException($"Found several modules named '{moduleName}' in the current process.", nameof(moduleName));
        }
        return modules[0];
    }

    public ModuleGetFunctionPointer(string moduleName) : this(GetModule(moduleName))
    {
    }

    public ModuleGetFunctionPointer(ProcessModule module)
    {
        _module = module ?? throw new ArgumentNullException(nameof(module));
    }

    public IntPtr GetFunctionPointer(string name) => NativeLibrary.TryGetExport(_module.BaseAddress, name, out var address) ? address : IntPtr.Zero;
}

最后,在程序的最开始,我们需要初始化SQLitePCLRaw提供程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const string name = "e_sqlite3";
SQLite3Provider_dynamic_cdecl.Setup(name, new ModuleGetFunctionPointer(name));
SQLitePCL.raw.SetProvider(new SQLite3Provider_dynamic_cdecl());

一切就绪后,可以在.NET框架上的单个文件可执行文件中使用SQLite EF核心数据库提供程序。完整的工作sample code可供参考。

请注意,如果您的目标是.NET核心而不是.NET框架,则如果这是必需的,则为none。Publishing a single-file executable将开箱即用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63887709

复制
相关文章
ASP.NET Core 使用 SQLite 教程,EF SQLite教程
https://blog.csdn.net/qq_31930499/article/details/80420246
痴者工良
2019/08/08
4.7K0
使用PyInstaller打包可执行文件
之前都是使用py2exe将Python程序打包成可执行文件,但是最近需要打包成Macos上的可执行程序。于是,选择了py2app,但是使用下来发现坑比较多,最终还是放弃了。
drunkdream
2018/12/28
2.8K0
pycharm 打包发布程序_pycharm打包成可执行文件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
4430
将编写的python程序打包成exe可执行文件
如何将编写的python文件打包成exe可执行文件呢。很简单,这里我们用控制台来进行打包。 下图是我在pycharm中利用网络爬虫编写的词典。现在我们要把它打包成可执行文件。
兰舟千帆
2022/07/16
5390
将编写的python程序打包成exe可执行文件
将python的代码文件打包成可执行文件
-F, –onefile 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用 -D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护 -K, –tk 在部署时包含 TCL/TK -a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码. -d, –debug 产生debug版本的可执行文件 -w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效) -c,–nowindowed,–console 使用控制台子系统执行(默认)(只对Windows有效)
JQ实验室
2022/02/09
8270
Python 打包可执行文件
   Python程序需要依赖本机安装的Python库,若想在没有安装Python的机器上运行,则需要打包分发,目前有两个比较好用的工具:PyInstaller和py2exe。其中py2exe应用在windows下,而PyInstall则可应用windows、Linux以及Mac OS X上。
py3study
2020/01/07
8040
如何打包python代码成exe可执行文件
大家写好了python代码一直在工具上面打开是不是觉得很不方便,那么今天呢就给大家提供一个很实用的技巧,就是给python代码打包成可执行的文件。直接点击就可以运行了,那么究竟是怎么打包的呢,跟着我一步步来看
找Bug
2022/07/22
7960
如何打包python代码成exe可执行文件
使用PyInstaller工具将Python程序打包成Mac可执行文件步骤
前几天在Python钻石群【Jethro Shen】问了一个Python打包的问题,这里拿出来给大家分享下。
前端皮皮
2023/08/17
1.2K0
使用PyInstaller工具将Python程序打包成Mac可执行文件步骤
抬抬小手教你将Python程序打包成可执行文件
Python编程语言是一款功能强大的免费开源的通用型计算机程序应用语言,对于经验丰富的开发人员来说,掌握这样一款语言在其程序开发中是一个比较重要的选择。我们今天就先来了解一下python打包方法的相关应用。
查理不是猹
2022/01/06
7360
如何将网站打包成exe可执行文件
本文最后更新于2022年04月25日,已超过48天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
田小檬
2022/08/30
2.3K0
Asp.net中使用Sqlite数据库
Sqlite是最近比较流行的数据库了,拥有比Access高效快速,易操作易实施。完全不需要在客户端进行任何的配置,只需要在站点中引用入DLL文件即可使用了。
SAP梦心
2022/05/10
2.3K0
pycharm怎么打包成exe文件_pycharm打包成可执行文件
1.首先添加图片文件转py文件得工具pyrcc 打开File中的Settings
全栈程序员站长
2022/09/27
1.3K0
pycharm怎么打包成exe文件_pycharm打包成可执行文件
Python打包成exe可执行文件
在项目上,帮财务开发了一个小工具,但财务不会用python,需要帮忙打包成exe可执行文件。目前比较常见的打包exe方法都是通过Pyinstaller来实现的,本文也将使用这种常规方法。
用户9925864
2022/07/27
1.2K0
Python打包成exe可执行文件
公司只提供签名服务,不提供证书文件,如何打包Electron应用
代码签名的主要目的是为了确保软件的来源(这个软件是由谁生产的)和软件的内容不被篡改
liulun
2020/12/09
2.4K0
公司只提供签名服务,不提供证书文件,如何打包Electron应用
.NET Core New csproj 如何发布可执行文件
  .NET工具链在最新的Preview3版本中,引入了新的MSBuild项目系统,项目文件又回归了.csproj的XML文件来管理,项目文件、包引用、程序集引用、.NET Core工具集、发布内容定义等内容。本文主要将主要讨论,如何在新的项目系统中(.csproj)发布可执行文件。我们都知道在之前的版本中,项目文件是通过project.json文件来管理项目和包引用的,那么通过删除 dependencies->Microsoft.NETCore.App-> "type": "platform" 子节点,并定义runtimes节点,来发布可执行文件(想了解的朋友可以阅读这篇文章) 。
yoyofx
2018/09/05
1.3K0
如何把你的.net程序打包上传到nuget
每个.net开发者都经常用nuget管理自己的程序包,install一个json组件啊,一个工具类什么的,这些都是别人写好的。如果我也写好了一个自己感觉很拿的出手的组件,想轻松的使用nuget来管理,那怎么上传到nuget呢?
乔达摩@嘿
2020/09/11
1.1K0
如何把你的.net程序打包上传到nuget
.Net用的SQLite
数据库冒似国内的游戏客户端用得比较少, 我见的都是用excel自己转换的... 其实一直想在引擎里加个数据库, 但是这个跟游戏逻辑比较紧密, 就没搞... 不过, 可以确定的是, 脱离服务器运行的数据库最好的选择应该是SQLite 在用.Net做工具时正好要用, 于是查了一下, 找到两种解决方案: sqlite-net 小巧, 一个cs文件, 一个native dll(C++也可以调用) 接口清晰, 基本上一看就懂, 好学 支持LINQ, 虽小却功能一个不少 相当于原生sqlite c api的一个包装吧
逍遥剑客
2018/05/23
8750
.NET Core 使用 EF 出错的解决方法
在.NET Core 项目钟(类库),使用Entity Framework,建立模型生成数据库时,失败
痴者工良
2019/08/08
2.8K0
Python 3 代码打包可执行文件EXE
我们写好的代码.py源文件,打包成EXE可执行文件,这样即使在没有安装Python的电脑上也可以执行。使用pyinstaller,参数如下(该命令直接在CMD命令提示符中运行):
用户6184845
2019/10/10
1.2K0
Python 3 代码打包可执行文件EXE
【.net】使用EF的一点小问题
最近有.net的项目。用到了Entity Framework,先简单地学习一下的时候,遇到了点问题。
东风压倒西风
2022/12/07
5640

相似问题

在内存中使用SQLite运行EF核心-尚未配置数据库提供程序

10

无法与EF核心的SQLite提供程序创建多对多关系

12

如何使用ef核心处理多个迁移提供商(SQLite、AzureSQL)?

19

Ef核心HasConversion不使用CosmosDb提供程序

18

将python程序打包到单个可执行文件中

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文