C# Clickonce 使用 gMap 发布 DLL 问题

女人

我有一个已经使用了很长时间的应用程序。我最近添加了一些新功能,包括 gMap。当我调试或构建它并测试时,我的应用程序运行良好。当我作为 clickonce 发布然后安装在我的同一台机器上时会出现问题。应用程序安装,当它尝试运行时,我收到错误“WMS 工具箱已停止工作”。查看事件查看器,我发现它显然缺少与 gMap 相关的 dll 文件。

--事件查看器故障1--


 Description: The process was terminated due to an unhandled exception.

 Exception Info: System.DllNotFoundException
    at System.Data.SQLite.UnsafeNativeMethods.sqlite3_libversion()
    at GMap.NET.CacheProviders.SQLitePureImageCache.Ping()
    at GMap.NET.GMaps.SQLitePing()
    at GMap.NET.WindowsForms.GMapControl..cctor()

 Exception Info: System.TypeInitializationException
    at GMap.NET.WindowsForms.GMapControl..ctor()
    at wmsToolBox.wmsToolBox.InitializeComponent()
    at wmsToolBox.wmsToolBox..ctor()
    at wmsToolBox.Program.Main()

--事件查看器故障2--


 Faulting application name: wmsToolBox.exe, version: 1.0.0.0, time stamp: 
 0x5d70eddb
 Faulting module name: KERNELBASE.dll, version: 10.0.15063.1836, time 
 stamp: 0xbb572fa7
 Exception code: 0xe0434352
 Fault offset: 0x000f18e2
 Faulting process id: 0x3a8
 Faulting application start time: 0x01d563db00e3051a
 Faulting module path: C:\windows\System32\KERNELBASE.dll
 Report Id: 0bc8cd8f-c137-4cd8-a8d8-880ce20add89
 Faulting package full name: 
 Faulting package-relative application ID: 

我注意到这似乎是依赖于 sqlite.dll 的应用程序的一个已知问题。


从其他帖子中获取建议,这是我尝试过的:

  • 从应用程序中删除所有引用并将它们添加回来,确保它们都已更新
  • 我曾尝试在我的应用程序中创建 x86 和 x64 文件夹,并将 SQLite.Interop.dll 提供给这两个文件夹(这对应用程序的性能没有影响)
  • 我已经下载了预编译的 .net,然后将 System.Data.SQLite.dll 放在我的 exe 附近(这会导致安装错误,指出 dll 文件已存在于文件夹中并且无法安装)
  • 我尝试将 dll 文件添加到 clickonce 安装文件夹并再次运行该应用程序。(这导致了以下错误:

    异常信息:System.BadImageFormatException at GMap.NET.CacheProviders.SQLitePureImageCache.Ping() at GMap.NET.GMaps.SQLitePing() at GMap.NET.WindowsForms.GMapControl..cctor())

我参考的来源


如何使用 ClickOnce 发布带有 SQLite 的 Winforms 应用程序

我还参考了以下网站上的建议。它们与 SO 上的帖子大致相同。

https://github.com/oysteinkrog/SQLite.Net-PCL/issues/158

女人

我终于能够解决这个问题。正如 elwood472 所说,它与他提供的笔记非常相似。我有一些微妙的补充,以提供更加简洁。这假定您已将引用添加到您的应用程序。

  1. 确定您的应用程序的目标框架,我的是 4.5.1
  2. 在项目中创建 x86 和 x64 文件夹
  3. 导航到项目文件夹 solution/packages/System.Data.SQLite.Core.1.0.111.0/build/$target framework version$。您将在这里看到 x64 和 x86 文件夹,希望如此!
  4. 在 x64 文件夹下,将 SQLite.Interop.dll 文件复制到您的项目 x64 文件夹下
  5. 在 x86 文件夹下,将 SQLite.Interop.dll 文件复制到您的项目 x86 文件夹下
  6. 将两个文件的属性设置为 Build Action: content; 复制到输出目录:如果更新则复制

发布应用程序,它终于为我工作了。我想我通过搜索文件得到了不正确的框架版本。Elwood472 提议使用以下目录:\Solution Name\packages\System.Data.SQLite.Core.1.0.111.0\lib\net46\,根据您为其构建应用程序的框架,该目录可能不正确。我不确定 x86 和 x64 文件是否有区别,但我将它们复制到各自的文件夹中,效果很好。

如果您使用了错误的框架版本,您可能会在事件查看器中收到一条错误消息,显示Exception Info: System.BadImageFormatException

如果您缺少所有 dll 文件,您可能会在事件查看器中收到错误信息,显示Exception Info: System.DllNotFoundException

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章