无法加载文件或程序集“System.Data.SQLite”

我在我的ASP.NET项目中安装了ELMAH 1.1 .Net 3.5 x64,现在我得到这个错误(每当我尝试看到任何页面):

无法加载文件或程序集“System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139”或其某个依赖项。 试图加载格式不正确的程序。

说明:执行当前Web请求期间发生未处理的exception。 请查看堆栈跟踪,了解有关错误的更多信息以及源代码的来源。

exception详细信息:System.BadImageFormatException:无法加载文件或程序集“System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139”或其某个依赖项。 试图加载格式不正确的程序。

在底部更多的错误细节。

我的主动解决scheme平台是“任何CPU”,我正在x64上运行x64的Windows 7,当然还有处理器。 我们之所以使用这个版本的ELMAH,是因为1.0 .Net 3.5(x86,它是它编译的唯一平台)在我们的x64 Windows服务器上给了我们同样的错误。

我已经尝试编译x86和x64,并得到相同的错误。 我试过删除所有的编译器输出(bin和obj)。 最后,我直接引用了SQLite dll,这个项目在服务器上不需要,我得到了这个编译错误:

错误1警告作为错误:程序集生成 – 引用的程序集“System.Data.SQLite.dll”目标不同的处理器MyProject

任何想法可能是什么问题?

更多的错误信息:

源错误:

在执行当前Web请求期间生成未处理的exception。 有关exception的来源和位置的信息可以使用下面的exception堆栈跟踪来标识。

堆栈跟踪:

[BadImageFormatException:无法加载文件或程序集“System.Data.SQLite,版本= 1.0.61.0,文化=中立,PublicKeyToken = db937bc2d44ff139”或其依赖项之一。 试图加载格式不正确的程序。]
System.Reflection.Assembly._nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,Assembly locationHint,StackCrawlMark&stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection)+0
System.Reflection.Assembly.nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,Assembly locationHint,StackCrawlMark&stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection)+43
System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,证据assemblySecurity,StackCrawlMark&stackMark,Boolean forIntrospection)+127 System.Reflection.Assembly.InternalLoad(String assemblyString,证据assemblySecurity,StackCrawlMark&stackMark,布尔forIntrospection)+142 System.Reflection.Assembly。加载(stringassemblyString)+28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName,Boolean starDirective)+46

[ConfigurationErrorsException:无法加载文件或程序集“System.Data.SQLite,版本= 1.0.61.0,文化=中立,PublicKeyToken = db937bc2d44ff139”或其依赖项之一。 试图加载格式不正确的程序。]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName,Boolean starDirective)+613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory()+203 System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai)+105
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig)+178
System.Web.Compilation.BuildProvidersCompiler..ctor(VirtualPath configPath,Boolean supportLocalization,String outputAssemblyName)+54
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean isPrecompiledApp)+232
System.Web.Compilation.BuildManager.CompileGlobalAsax()+52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()+337

[HttpException(0x80004005):无法加载文件或程序集“System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139”或其某个依赖项。 试图加载格式不正确的程序。]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException()+58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()+512 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager,IApplicationHost appHost,IConfigMapPathFactory configMapPathFactory,HostingEnvironmentParameters hostingParameters)+729

[HttpException(0x80004005):无法加载文件或程序集“System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139”或其某个依赖项。 试图加载格式不正确的程序。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext上下文)+8896783
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext上下文)+85
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)+259

System.Data.SQLite.dll是一个混合程序集,即它包含托pipe代码和本地代码。 因此,一个特定的System.Data.SQLite.dll是x86或x64,但从来没有。

更新( 由J. Pablo Fernandez提供 ): Cassini是Visual Studio使用的开发Web服务器,当您按F5键或单击绿色的“play”button时,仅为x86,这意味着即使您的工作站是x64,能够使用x86版本的System.Data.SQLite.dll。

另一种方法是不使用卡西尼,而是使用正确的x64的IIS7。

确保应用程序池的“启用32位应用程序”设置为false。

转到IIS7 Application Pool -> advanced settings and set the 32-bit application to true

这非常简单,如果你不使用SQLite:

您可以从解决scheme的bin文件夹中删除SQLite DLL,然后从引用ELMAH的文件夹中删除SQLite DLL。 重build,你的应用程序不会尝试加载你不使用的DLL。

我有一个64位的开发机器和32位生成服务器。 我在NHibernate初始化之前使用了这个代码。 在任何架构上都有魅力(我已经testing过了)

希望这有助于某人。

圭多

  private static void LoadSQLLiteAssembly() { Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase); FileInfo fi = new FileInfo(dir.AbsolutePath); string binFile = fi.Directory.FullName + "\\System.Data.SQLite.DLL"; if (!File.Exists(binFile)) File.Copy(GetAppropriateSQLLiteAssembly(), binFile, false); } private static string GetAppropriateSQLLiteAssembly() { string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"); string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64"); return GetLibsDir() + "\\NUnit\\System.Data.SQLite.x" + arch + ".DLL"; } 

作为一个必须在Roadkill Wiki上处理相同问题的不lessbug报告的人,这就是你需要做的事情:

  • 你使用的是x64还是x86? Sqlite附带的单独体系结构的DLL – 复制正确的一个到您的bin文件夹,有两个官方提供程序的DLLS: System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • 如果你不能打扰这些程序集,为你的应用程序池启用32位模式(通常只有开发机器的解决scheme)
  • 如果您在服务器上托pipe,则需要Microsoft C ++运行时可再发行组件 – 默认情况下,它不会安装在Server 2008 R2上。 x64版本 , x86版本

这是一个真正的痛苦,在重新分配SQLite .NET二进制文件时,有多less环节需要跳过,我最后的Roadkill解决scheme是根据您使用的体系结构将正确的二进制文件复制到〜/ bin文件夹。 不幸的是,这并不能解决C ++运行时问题。

手动加载相关的System.Data.SQLite程序集可以解决这个问题。

修改了gatapia的代码如下:

  public static void LoadSQLLiteAssembly() { Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase); FileInfo fi = new FileInfo(dir.AbsolutePath); string appropriateFile = Path.Combine(fi.Directory.FullName, GetAppropriateSQLLiteAssembly()); Assembly.LoadFrom(appropriateFile); } private static string GetAppropriateSQLLiteAssembly() { string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"); string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64"); return "System.Data.SQLite.x" + arch + ".DLL"; } 

当我们的Windows服务器从32位操作系统转换为64位时,我得到了这个错误。 抛出错误的程序集被设置为以x86模式(即32模式)编译。 我把它切换到“任何CPU”,并做了伎俩。 您可以通过执行以下操作更改此值:

右键单击项目,进入Properties -> Build -> Platform Target -> change to "Any CPU"

我通过安装带有Nuget扩展名的System.Data.SQLite解决了这个问题。 此扩展可用于Visual Studio 2010或更高版本。 首先,你必须安装Nuget扩展。 你可以按照这里:

  • 转到Visual Studio 2010,菜单 – >工具
  • select扩展pipe理器
  • 在search框中inputNuGet,然后点击在线图库。 等待它检索信息…
  • select检索到的NuGet包pipe理器,点击下载。 等待下载…
  • 单击Visual Studio扩展安装程序NuGet程序包pipe理器上的安装。 等待安装完成。
  • 单击closures和“立即重新启动”。

其次,现在,你可以安装SQLite:

  • 进入Visual Studio菜单工具 – >程序包pipe理器 – >程序包pipe理器控制台。
  • 然后在软件包pipe理器控制台中运行命令Install-Package System.Data.SQLite。 像这样: 在包pipe理器控制台中运行命令Install-Package System.Data.SQLite

而现在,你可以使用System.Data.SQLite。

在这种情况下,您会看到两个文件夹x64和x86,这些文件夹包含SQLite.Interop.dll。 现在转到这些dll的属性窗口,并设置构build操作是内容和复制到输出目录是复制总是。

所以,这是我的方式。

谢谢。 越南HoChiMinh市的Kim Tho Pham。 电子邮件:tho.phamkim@gmail.com

在我们的情况下没有工作,因为我们的生产服务器已失踪

Microsoft Visual C ++ 2010 SP1可再发行组件包(x86)

我们安装它,一切正常。 应用程序池必须将启用32位应用程序设置为true,并且必须使用x86版本的库

我奇怪的解决了这个问题,通过Nuget GUI应用程序安装System.Data.SQLite,而不是软件包pipe理器控制台。

通过控制台安装不包括这个库需要运行的依赖关系。

我想出了两个快速解决scheme。 要么为我工作。 我认为这个问题是因为权限。

1)而不是从net-2.0目录使用Elmah.dll文件,我从net-1.1使用Elmah.dll。

2)而不是保持在项目bin目录中的Elmah.dll。 我做一个dll目录把它放进去。

解决这个问题的另一种方法是将您的应用程序升级到ELMAH 1.2而不是1.1。

你可以删除你的bindebugging文件夹并重新编译一次吗?

或者检查你的项目引用到System.Data.SQLite ,跟踪它所在的位置,然后在reflection器中打开dll。 如果你不能打开它,这意味着该DLL已损坏,你可能想要find一个正确的或重新安装.NET框架。

如果您在开发计算机上使用IIS Express作为Web服务器,则会更改为本地IIS。 这对我有效。

System.Data.SQLite依赖于System.Data.SQLite.interop确保两个软件包是相同的版本,都是x86

这是一个古老的问题,但我尝试了以上所有。 我正在研究严格的x86项目,所以没有两个文件夹/ x86,/ x64。 但由于某种原因, System.Data.SQLite是一个不同的版本System.Data.SQLite.interop ,一旦我拉下匹配的DLL问题已修复。