仅当未安装 Visual C# 且仅在 32 位上时,C# 应用程序才会崩溃

标签 c# crash clr system.data.sqlite visual-c#-express-2010

我有一个open source C# appWiX安装程序,依赖于.NET 4.5。

  • Windows7 64 位(安装了 .NET 4.5)用户表示它运行良好。
  • Windows7 32 位(安装了 .NET 4.5)用户表示它崩溃了。

所以我安装了 Windows7 32 位(在 VirtualBox 中),安装了应用程序,但确实崩溃了:

enter image description here

问题签名 09 是 System.IO.DirectoryNotFound,Windows 事件查看器提到 C:\Windows\system32\KERNELBASE.dll,如果这可以提供线索.

然后我决定在同一台计算机上安装 Visual C# 2010 Express,并且...
惊喜:应用程序不再崩溃(无论是安装的应用程序还是通过 Visual C# 执行时)

如何避免这种崩溃?
我无法要求所有用户安装 Visual C#...

最佳答案

我认为这更多的是一种预感,而不是答案,但它似乎有所帮助。我将完成我的思考过程。

基于该应用程序在 64 位而不是 32 位上运行的事实,我立即想到 BadImageFormatException 或在 Program Files (x86) 中查找的编码路径不正确> (或类似 64 位/32 位注册表值的内容)。但后来我们发现安装了 VS 后一切都很好,这很奇怪。因此,我开始查看项目文件和引用资料。几乎所有内容都是托管代码/MSIL,因此看起来与 32 位/64 位问题无关。然而,在其中一个引用项目 (SparkleLib.Cmis) 中,我看到了对 System.Data.SQLite 的引用,我知道它具有非托管组件。我用谷歌搜索了docs 。他们提到了这一点:

All the "static" packages contain either native or mixed-mode assembly binaries linked statically to the appropriate version of the Visual C++ runtime. Typically, these packages are used in cases where customer machines may not have the necessary version of the Visual C++ runtime installed and it cannot be installed due to limited privileges.

所以我现在非常确定,这是一个部署不正确的System.Data.SQLite,它恰好在开发箱上工作,因为 VS 已经在那里了。 OP 已确认这确实是问题所在。

关于仅当未安装 Visual C# 且仅在 32 位上时,C# 应用程序才会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13449186/

相关文章:

c# - 这个静态反射代码的用例是什么?

android - React Native 应用程序未在物理设备上运行

clr.dll 异常导致 iis 崩溃,clr.dll 的 PDB 符号未加载,SOS 版本与您正在调试的 CLR 版本不匹配

C++:__try...__except;在 Release模式下隐藏崩溃?

c# - 反射(reflect) .NET 中的类产生的方法仅与修饰符不同

.net - 创建强名称托管 (/clr) C++ 程序集

c# - 什么是白标 dll 的好方法

c# - LINQ 按多列搜索

c# - 如何将复选框添加到绑定(bind)到数据源的数据 GridView ?

uitableview - iPhone iOS 4 核心数据 - 程序收到信号 : “EXC_BAD_ACCESS”