2

我有一个带有WiX安装程序的开源 C# 应用程序,依赖于 .NET 4.5。

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

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

在此处输入图像描述

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

然后我决定在同一台机器上安装 Visual C# 2010 Express,然后......
惊喜:应用程序不再崩溃(安装的应用程序和通过 Visual C# 执行时都没有)

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

4

2 回答 2

1

这只是一个猜测,因为我手头没有所有信息。但是CLR20r3Common Language Runtine 2.0 revision 3,所以我有三种可能的解决方案。我在对我们的一种主要产品进行回归测试时遇到了所有这些问题。

包装

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

.NET 版本

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

目标应用平台

一些第三方 dll 不适用于所有配置,因此我可能值得检查它是否可以在可执行文件中设置“any-cpu”位的情况下工作。(即面向 x86 或 x64 构建,不要在 Visual Studio 中使用“any-cpu”)。

更新

在对这个特定案例进行一些谷歌搜索后,我认为 .NET 版本是问题所在,特别是因为P2P5Exe 文件程序集版本号错误程序集Deciphering the .NET clr20r3 exception parameters P1..P10 提供)都是0.0.0.0 . 应用程序不会仅仅因为缺少文件而加载,在这种情况下,我猜它是属于 .NET 4.5 以外的 .NET 框架版本的文件。

于 2012-11-19T07:49:50.743 回答
1

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

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

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

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

于 2012-11-20T04:30:15.927 回答