【发布时间】:2013-01-15 18:47:09
【问题描述】:
我在 .NET 4.0 中创建了一个非常简单的控制台应用程序,它将作为计划任务运行。它查找在一定时间内未修改的本地文件,然后解析文件,将记录插入 MySQL 数据库,并将文件复制到网络。我正在使用本地 SQLite 数据库来跟踪哪些文件已被处理,但不幸的是,我在第一次 SQLite 操作时在一个系统上遇到了问题:
System.BadImageFormatException: Could not load file or assembly 'System.Data.SQLite.dll' or one of its dependencies. is not a valid Win32 application. (Exception from HRESULT: 0x800700C1) File name: 'System.Data.SQLite.dll'
at FileDatabase.CreateDatabaseAndTable()
at Program.Main(String[] args)
此异常会在一个系统上引发(Windows 7 x64 Home Premium 和 .NET 4.0 完整版),但不会在其他两个系统上引发(开发系统 + 另一个,都是 Windows 7 x64 Professional 和 .NET 4.0 完整版)。
通过浏览其他问题,我发现当程序在 64 位模式下运行时可能会发生这种情况,因为 SQLite DLL 是 32 位版本。我检查的第一件事是 Visual Studio 配置管理器中的活动平台是 x86。我还使用 IL DASM 来验证输出 exe 是否为 32 位(.corflags 0x00000003 // ILONLY 32BITREQUIRED)。我希望将 32 位 SQLite DLL 和目标平台保留为 x86,这样我就不必为 32 位和 64 位计算机制作不同版本的应用程序。
我还了解到,由于 DLL 文件损坏,可能会发生此异常,但由于它适用于某些计算机,因此我认为情况并非如此。
我在问题系统上尝试过的其他没有帮助的方法:
- 在 GAC 和 Windows 目录中搜索错误的 SQLite DLL,但没有找到。
- 关闭 AVG 防病毒软件。
- 直接运行 exe 而不是已发布的 ClickOnce 应用程序。
- 卸载并重新安装 ClickOnce 应用程序。
任何建议将不胜感激 - 谢谢!
【问题讨论】:
-
你没有这么说,但我想你已经尝试过替换坏系统上的Sqlite.dll。对吗?
-
@Steve 是的,我已经卸载并重新安装了 ClickOnce 应用程序,并直接从本地复制的 exe 与同一目录中的 DLL 运行。
-
@RoadBump 虽然问题是一样的,但修复方法不是 - 我已经尝试过引用问题中的答案但没有成功(参见第 3 段)。
-
可能 c++ redist 安装不正确。我记得在一个问题中提到它,但现在找不到它。尝试使用供应商的安装程序,而不是仅仅复制 dll。
标签: c# system.data.sqlite badimageformatexception