You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForms程序添加GMap.NET后,bin目录外运行/安装启动异常

解决GMap.NET导致WinForms发布后崩溃的DllNotFoundException问题

核心原因

GMap.NET的SQLitePureImageCache依赖SQLite原生DLL(sqlite3.dll),Debug模式下Visual Studio会自动从NuGet包的runtimes目录复制对应架构的DLL到输出目录,但发布/手动复制目录时,这些原生DLL常被遗漏,导致程序初始化SQLitePureImageCache时触发TypeInitializationException(根源是System.DllNotFoundException),最终引发崩溃。

解决方案

1. 确保SQLite原生DLL被正确复制到输出路径

  • 在项目根目录创建x86和x64两个文件夹,分别放入对应架构的sqlite3.dll(可从NuGet包路径packages/GMap.NET.Core.x.x.x/runtimes/win-x86/native/和win-x64/native/获取)。
  • 将这两个DLL添加到项目中(右键项目→添加→现有项)。
  • 选中每个DLL,在属性面板设置:
    • 生成操作:内容
    • 复制到输出目录:始终复制

2. 替换缓存模式避开SQLite(可选)

如果不需要本地SQLite缓存,可在程序启动时切换到无缓存或文件缓存,避免加载SQLite DLL:

// 在Program.cs的Main方法或主窗体构造函数的InitializeComponent()之前添加
GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.ServerOnly; // 仅从服务器加载,不使用本地缓存
// 或使用文件缓存替代SQLite:
// GMap.NET.GMaps.Instance.ImageCache = new GMap.NET.WindowsForms.ImageCache();

3. 检查安装包的文件包含配置

  • 若使用Visual Studio安装项目/WiX等工具,需将x86和x64文件夹及其中的sqlite3.dll添加到安装包,确保安装时复制到程序目录的对应子文件夹。
  • 或根据目标系统架构,将对应版本的sqlite3.dll直接复制到主程序目录。

4. 验证输出目录

发布前检查bin/Release目录,确认存在x86和x64文件夹且包含sqlite3.dll,若缺失则手动复制或调整NuGet包的依赖设置。

内容的提问来源于stack exchange,提问作者Francisco Benito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:22:19