C# Clickonce 使用 gMap 发布 DLL 问题

C# Clickonce Publishing DLL issues with gMap

我有一个应用程序已经使用了很长时间了。我最近添加了一些新功能,包括 gMap。当我调试或构建并测试我的应用程序时,它运行良好。当我发布为 clickonce 然后安装在我的同一台机器上时,就会出现此问题。该应用程序已安装,当它尝试 运行 时,我收到错误 "WMS Toolbox has stopped working"。查看事件查看器,我发现它显然缺少与 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.dlls 的应用程序的已知问题。


采纳其他 post 的建议,这是我尝试过的方法:

我引用的来源


我还参考了以下站点中的建议。它们与 SO 上的 post 基本相同。

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

不幸的是,我遇到了同样的问题。我希望你有一个解决方案...

我看过其中一些解决方案,但没有尝试过。我找到的一种解决方案是下载 GMAP 源并将其编译为 AnyCode 版本,但我不知道该怎么做。

我已经使用已知的解决方案自行解决了这个问题。我很具体,因为如果以这种方式向我解释,我会更快地完成它。它涉及创建 x64 和 x86 文件夹。

在 Visual Studio 中,查看您的解决方案资源管理器。在项目的根目录下,为 x64 添加一个文件夹,为 x86 添加另一个文件夹。

对于每个文件夹,右键单击,select 添加,然后选择现有项目。将文件 SQLite.Interop.dll 添加到其中。完成后,您必须能够在解决方案资源管理器中看到文件夹和文件。

在解决方案资源管理器中,select 文件 SQLite.Interop.dll。在属性中,将复制到输出目录设置为 "Copy if Newer"。对每个文件夹(x86 和 x64)执行此操作。

就是这样。当您发布项目时,它现在应该可以工作了。

我终于能够解决这个问题。正如 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 文件是否有区别,但我将它们复制到各自的文件夹中并且工作正常。

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

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