我有open source C# app个WiX安装程序,依赖于.NET 4.5。
所以我安装了Windows7 32bit(在VirtualBox中),安装了应用程序,确实崩溃了:
问题签名09是System.IO.DirectoryNotFound
,Windows'事件查看器提到C:\Windows\system32\KERNELBASE.dll
,如果可以提供线索。
然后我决定在同一台机器上安装Visual C#2010 Express,并且...
SURPRISE :应用程序不再崩溃(既不是已安装的应用程序,也不是通过Visual C#执行时)
如何避免此次崩溃? 我不能要求所有用户安装Visual C#...
答案 0 :(得分:1)
这只是猜测,因为我手边没有所有信息。但 CLR20r3 是公共语言Runtine 2.0修订版3 ,所以我有三种可能的解决方案。我在其中一个主要产品的回归测试中遇到过所有这些。
您没有打包所有必需的dll,(ergo“找不到文件”),但它们随开发环境一起提供。在Visual Studio中将copy-local设置为true。
客户端没有安装.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已确认这确实是问题所在。