只有在未安装Visual C#且仅在32位上时,C#app才会崩溃

时间:2012-11-19 07:13:22

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

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

  • Windows7 64bit(安装了.NET 4.5)用户说它工作正常。
  • Windows7 32位(安装了.NET 4.5)用户说它崩溃了。

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

enter image description here

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

然后我决定在同一台机器上安装Visual C#2010 Express,并且...
SURPRISE :应用程序不再崩溃(既不是已安装的应用程序,也不是通过Visual C#执行时)

如何避免此次崩溃? 我不能要求所有用户安装Visual C#...

2 个答案:

答案 0 :(得分:1)

这只是猜测,因为我手边没有所有信息。但 CLR20r3 公共语言Runtine 2.0修订版3 ,所以我有三种可能的解决方案。我在其中一个主要产品的回归测试中遇到过所有这些。

包装

您没有打包所有必需的dll,(ergo“找不到文件”),但它们随开发环境一起提供。在Visual Studio中将copy-local设置为true。

.NET版

客户端没有安装.Net 2.0,因此CLR20r3失败(也“找不到文件”)。

目标应用程序平台

某些第三方dll在所有配置中都不起作用,所以我可能值得检查它是否可以在可执行文件中设置或不设置“any-cpu”位。 (即构建朝向x86或x64,并且不要在Visual Studio中使用“any-cpu”。)

更新

关于这个特定情况的谷歌搜索后,我认为.NET版本是问题,特别是因为 P2 P5 Exe文件程序集版本号< / strong>和错误汇编Deciphering the .NET clr20r3 exception parameters P1..P10提供) 0.0.0.0 。应用程序不会因为文件丢失而无法加载,在这种情况下,我猜这是一个属于.NET 4.5以外的.NET框架版本的文件。

答案 1 :(得分:1)

我称之为预感而不是答案,但它似乎有所帮助。我将完成我的过程。

基于应用程序在64位而不是32位上工作的事实,我立刻想到BadImageFormatException或查找Program Files (x86)的错误编码路径(或与64位/类似的东西) 32位注册表值)。但是后来我们知道安装VS后一切都很好,这很奇怪。所以,我开始查看proj文件和引用。几乎所有这些都是托管代码/ MSIL,所以它似乎不是任何可能与32位/ 64位问题相关的东西。但是,在其中一个参考项目(SparkleLib.Cmis)中,我看到System.Data.SQLite的引用,我知道它具有非托管组件。我用Google搜索docs。他们提到了这个:

  

所有“静态”软件包都包含本机或混合模式程序集   二进制文件静态链接到适当的Visual版本   C ++运行时。通常,这些包用于以下情况   客户机可能没有必要的Visual C ++版本   运行时已安装且由于受限而无法安装   特权。

所以我很确定在这一点上,它是一个不正确部署的System.Data.SQLite,它碰巧在开发盒上运行,因为VS已经存在了。 OP已确认这确实是问题所在。