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 的建议,这是我尝试过的方法:
- 从应用程序中删除所有引用并将它们添加回来,确保它们都已更新
- 我已经尝试在我的应用程序中创建 x86 和 x64 文件夹并为这两个文件夹提供 SQLite.Interop.dll(这对应用程序的性能没有任何影响)
- 我已经下载了预编译的 .net,然后将 System.Data.SQLite.dll 放在我的 exe 附近(这导致了安装错误,指出文件夹中已经存在 dll 文件,无法安装)
- 我已经尝试将 dll 文件添加到 clickonce 安装文件夹并再次 运行ning 应用程序。 (这导致了以下错误:
异常信息:System.BadImageFormatException
在 GMap.NET.CacheProviders.SQLitePureImageCache.Ping()
在 GMap.NET.GMaps.SQLitePing()
在 GMap.NET.WindowsForms.GMapControl..cctor())
我引用的来源
我还参考了以下站点中的建议。它们与 SO 上的 post 基本相同。
不幸的是,我遇到了同样的问题。我希望你有一个解决方案...
我看过其中一些解决方案,但没有尝试过。我找到的一种解决方案是下载 GMAP 源并将其编译为 AnyCode 版本,但我不知道该怎么做。
我已经使用已知的解决方案自行解决了这个问题。我很具体,因为如果以这种方式向我解释,我会更快地完成它。它涉及创建 x64 和 x86 文件夹。
在 Visual Studio 中,查看您的解决方案资源管理器。在项目的根目录下,为 x64 添加一个文件夹,为 x86 添加另一个文件夹。
对于每个文件夹,右键单击,select 添加,然后选择现有项目。将文件 SQLite.Interop.dll 添加到其中。完成后,您必须能够在解决方案资源管理器中看到文件夹和文件。
在解决方案资源管理器中,select 文件 SQLite.Interop.dll。在属性中,将复制到输出目录设置为 "Copy if Newer"。对每个文件夹(x86 和 x64)执行此操作。
就是这样。当您发布项目时,它现在应该可以工作了。
我终于能够解决这个问题。正如 elwood472 所说,它与他提供的注释非常相似。我提供了一些微妙的补充,以使其更加简洁。这假定您已将引用添加到您的应用程序。
- 确定你的应用的目标框架,我的是4.5.1
- 在您的项目中创建 x86 和 x64 文件夹
- 导航到项目文件夹 solution/packages/System.Data.SQLite.Core.1.0.111.0/build/$target framework version$。您会在这里看到一个 x64 和 x86 文件夹,希望如此!
- x64文件夹下,复制SQLite.Interop.dll文件到你的项目x64文件夹下
- x86文件夹下,将SQLite.Interop.dll文件复制到你的项目x86文件夹下
- 将两个文件的属性设置为Build Action: content;复制到输出目录:如果较新则复制
发布应用程序,它终于对我有用了。我想我通过搜索文件得到了不正确的框架版本。 Elwood472 提议使用目录:\Solution Name\packages\System.Data.SQLite.Core.1.0.111.0\lib\net46\ 根据您正在为其构建应用程序的框架,该目录可能不正确。我不确定 x86 和 x64 文件是否有区别,但我将它们复制到各自的文件夹中并且工作正常。
如果您的框架版本错误,您可能会在事件查看器中收到一条错误消息,显示 异常信息:System.BadImageFormatException
如果您缺少所有的 dll 文件,您可能会在事件查看器中收到一条错误消息,显示 异常信息:System.DllNotFoundException
我有一个应用程序已经使用了很长时间了。我最近添加了一些新功能,包括 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 的建议,这是我尝试过的方法:
- 从应用程序中删除所有引用并将它们添加回来,确保它们都已更新
- 我已经尝试在我的应用程序中创建 x86 和 x64 文件夹并为这两个文件夹提供 SQLite.Interop.dll(这对应用程序的性能没有任何影响)
- 我已经下载了预编译的 .net,然后将 System.Data.SQLite.dll 放在我的 exe 附近(这导致了安装错误,指出文件夹中已经存在 dll 文件,无法安装)
- 我已经尝试将 dll 文件添加到 clickonce 安装文件夹并再次 运行ning 应用程序。 (这导致了以下错误:
异常信息:System.BadImageFormatException 在 GMap.NET.CacheProviders.SQLitePureImageCache.Ping() 在 GMap.NET.GMaps.SQLitePing() 在 GMap.NET.WindowsForms.GMapControl..cctor())
我引用的来源
我还参考了以下站点中的建议。它们与 SO 上的 post 基本相同。
不幸的是,我遇到了同样的问题。我希望你有一个解决方案...
我看过其中一些解决方案,但没有尝试过。我找到的一种解决方案是下载 GMAP 源并将其编译为 AnyCode 版本,但我不知道该怎么做。
我已经使用已知的解决方案自行解决了这个问题。我很具体,因为如果以这种方式向我解释,我会更快地完成它。它涉及创建 x64 和 x86 文件夹。
在 Visual Studio 中,查看您的解决方案资源管理器。在项目的根目录下,为 x64 添加一个文件夹,为 x86 添加另一个文件夹。
对于每个文件夹,右键单击,select 添加,然后选择现有项目。将文件 SQLite.Interop.dll 添加到其中。完成后,您必须能够在解决方案资源管理器中看到文件夹和文件。
在解决方案资源管理器中,select 文件 SQLite.Interop.dll。在属性中,将复制到输出目录设置为 "Copy if Newer"。对每个文件夹(x86 和 x64)执行此操作。
就是这样。当您发布项目时,它现在应该可以工作了。
我终于能够解决这个问题。正如 elwood472 所说,它与他提供的注释非常相似。我提供了一些微妙的补充,以使其更加简洁。这假定您已将引用添加到您的应用程序。
- 确定你的应用的目标框架,我的是4.5.1
- 在您的项目中创建 x86 和 x64 文件夹
- 导航到项目文件夹 solution/packages/System.Data.SQLite.Core.1.0.111.0/build/$target framework version$。您会在这里看到一个 x64 和 x86 文件夹,希望如此!
- x64文件夹下,复制SQLite.Interop.dll文件到你的项目x64文件夹下
- x86文件夹下,将SQLite.Interop.dll文件复制到你的项目x86文件夹下
- 将两个文件的属性设置为Build Action: content;复制到输出目录:如果较新则复制
发布应用程序,它终于对我有用了。我想我通过搜索文件得到了不正确的框架版本。 Elwood472 提议使用目录:\Solution Name\packages\System.Data.SQLite.Core.1.0.111.0\lib\net46\ 根据您正在为其构建应用程序的框架,该目录可能不正确。我不确定 x86 和 x64 文件是否有区别,但我将它们复制到各自的文件夹中并且工作正常。
如果您的框架版本错误,您可能会在事件查看器中收到一条错误消息,显示 异常信息:System.BadImageFormatException
如果您缺少所有的 dll 文件,您可能会在事件查看器中收到一条错误消息,显示 异常信息:System.DllNotFoundException