【问题标题】:C# Clickonce Publishing DLL issues with gMapC# Clickonce 使用 gMap 发布 DLL 问题
【发布时间】:2019-09-30 21:20:19
【问题描述】:

我有一个应用程序已经使用了很长时间。我最近添加了一些新功能,包括 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 在 GMap.NET.CacheProviders.SQLitePureImageCache.Ping() 在 GMap.NET.GMaps.SQLitePing() 在 GMap.NET.WindowsForms.GMapControl..cctor())

我引用的来源


How to Publish a Winforms App with SQLite using ClickOnce

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

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

【问题讨论】:

    标签: c# winforms clickonce


    【解决方案1】:

    我终于能够解决这个问题。正如 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

    【讨论】:

      【解决方案2】:

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

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

      https://stackoverflow.com/a/43886479/4114838

      【讨论】:

      • 我还没有尝试从我的电脑构建和编译 GMAP。我的项目设置为 anycpu,它在 64 位机器上运行,很难相信我正在做一些非典型的事情!我还尝试将我的应用程序更改为更喜欢 64 位和 32 位但没有成功。
      【解决方案3】:

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

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

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

      在解决方案资源管理器中,选择文件 SQLite.Interop.dll。在属性中,将复制到输出目录设置为“如果较新则复制”。对每个文件夹(x86 和 x64)执行此操作。

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

      【讨论】:

      • 您从哪里获得 SQLite.Interop.dll 文件?我在其他地方看到过这个解决方案,我确实尝试过但没有成功。根据搜索,我使用了解决方案文件夹中的 SQLite.Interop.dll 文件。此外,该文件是否有 64 位和 32 位版本,或者该文件与处理器无关,即两个文件夹中的文件相同?
      • 我从 System.Data.SQLite (v1.0.111) 的 NuGet 包中获取了文件。我在我的计算机上的项目文件夹中找到了它:\Solution Name\packages\System.Data.SQLite.Core.1.0.111.0\lib\net46\ 我刚刚抓取了同一个文件。我认为没有 x64 或 x86 版本。
      • 感谢您的反馈。下周我将回到这个项目,今天处理其他火灾!我会在/如果我得到解决方案时报告!
      • 我能够通过重新访问相同的方法并参考您的建议来完成这项工作。我相信我之前得到了错误的框架版本。
      • 很高兴听到这个消息!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多