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


126

我在ASP.NET项目中安装了ELMAH 1.1 .Net 3.5 x64,现在遇到此错误(无论何时尝试查看任何页面):

无法加载文件或程序集'System.Data.SQLite,版本= 1.0.61.0,区域性=中性,PublicKeyToken = db937bc2d44ff139'或其依赖项之一。试图加载格式错误的程序。

说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

异常详细信息:System.BadImageFormatException:无法加载文件或程序集'System.Data.SQLite,版本= 1.0.61.0,Culture =中性,PublicKeyToken = db937bc2d44ff139'或其依赖项之一。试图加载格式错误的程序。

底部有更多错误详细信息。

我的活动解决方案平台是“ Any CPU”,并且我正在x64处理器(当然是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请求的执行期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来标识有关异常的来源和位置的信息。

堆栈跟踪:

[BadImageFormatException:无法加载文件或程序集'System.Data.SQLite,版本= 1.0.61.0,文化=中性,PublicKeyToken = db937bc2d44ff139'或其依赖项之一。试图以错误的格式加载程序。]
System.Reflection.Assembly._nLoad(AssemblyName文件名,字符串codeBase,证据AssemblySecurity,程序集locationHint,StackCrawlMark&stackMark,布尔throwOnFileNotFound,布尔值用于自省)+0
System.Reflection.Assembly .nLoad(AssemblyName文件名,字符串codeBase,证据assemblySecurity,程序集locationHint,StackCrawlMark&stackMark,布尔throwOnFileNotFound,布尔forIntrospection)+43
System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,证据assemblySecurity,StackCrawlMark&stackMark,布尔值用于自省)+127 System.Reflection.Assembly.InternalLoad(字符串assemblyString,证据AssemblySecurity,StackCrawlMark&stackMark,Boolean forIntrospection)+142 System.Reflection.Assembly Load(字符串assemblyString)+28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串assemblyName,布尔型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(布尔isPrecompiledApp)+232
System.Web.Compilation.BuildManager.CompileGlobalAsax()+52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()+337

[HttpException(0x80004005):无法加载文件或程序集'System.Data.SQLite,版本= 1.0.61.0,Culture =中性,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,HostingEnvironmentParametershostingParameters)+729

[HttpException(0x80004005):无法加载文件或程序集'System.Data.SQLite,版本= 1.0.61.0,Culture =中性,PublicKeyToken = db937bc2d44ff139'或其依赖项之一。试图加载格式错误的程序。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext上下文)+8896783
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext上下文)+85
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr )+259


在这种情况下,Fusion(装配件绑定)日志比此堆栈跟踪表有用得多。
2009年

1
似乎问题是卡西尼号是x86。
pupeno

我遇到了同样的问题,由于我们混合的生产/开发环境,不得不放弃ELMAH。鉴于在高流量生产的Web服务器上使用SQLite听起来不太好,而且SQLite dll是ELMAH中唯一迫使其具有针对x86和64x位的两个不同版本的组件,这一事实使我感到奇怪,为什么ELMAH的家伙会拉并使其可选,而不是现在的样子。
卡什

Answers:


122

System.Data.SQLite.dll是混合程序集,即它既包含托管代码又包含本机代码。因此,特定的System.Data.SQLite.dll是x86或x64,但两者都不是。

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

另一种选择是不使用Cassini,而是使用IIS7,它是正确的x64。


3
我在x64计算机上使用x64版本。
pupeno

您是否尝试过使用x86版本?
2009年

2
不久前可用的新替代方法是使用IIS Express,它允许您设置要使用的应用程序池的类型
Raul Vejar 2012年

@Raul Vejar:请详细说明IIS Express的应用程序池选择功能如何解决32位/ 64位程序集问题。谢谢
Tim

@Tim,该功能允许您选择要使用的应用程序池类型(32位或64位),这样您就可以控制Cassini中固定的方面并使用您拥有的位库。换句话说,如果您正在使用32位版本的SQLite dll,则应在IIS Express上选择32位应用程序池。对于库的64位版本,应选择64位应用程序池。
劳尔·维哈尔

77

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


2
如果要在64位计算机上使用x86 dll,则此方法有效。在我们的案例中,我们的开发环境与生产环境不匹配,因此这是最有效的方法。
罗布2010年

17
对我来说将其设置为true实际上解决了这个问题。我猜默认情况下Elmah附带了32位sql lite程序集。

1
@Jirapong和Sergey均为+1,因为正是这种设置,我必须操纵它才能使工作正常。就我而言,我认为我具有SqlLite DLL的x86版本,需要将“启用32位应用程序”设置为“ true”。
t3rse 2011年

43

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


我正在运行Windows 7,但遇到了这个问题;为我启用32位修复程序,大概是因为我的DLL副本是32位的。
道格

1
仅供参考:必须将应用程序池标识设置为LocalSystem才能运行:^
Illuminati

并确保有SQLite.Interop.dll的Win32版本stackoverflow.com/questions/4816529/...
莫滕Holmgaard

14

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

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


5
+1如果您不使用SQLite,那么为什么还要修复引用的DLL?尼斯,优雅,正是我所需要的。
bhavinb 2011年

这在本地有效,但是在部署到Azure之后我得到了错误。
stuartdotnet 2014年

8

我有一台64位开发机和32位构建服务器。我在NHibernate初始化之前使用了此代码。在任何体系结构上都具有魅力(我测试过的2种)

希望这对某人有帮助。

圭多

        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";
        }

有人成功使用过这种技术吗?我在一个asp.net mvc应用程序测试解决方案中尝试了它,但对我来说不起作用。
格伦

1
您可以直接使用CLR而不是转到环境变量:string arch = IntPtr.Size == 8?“ x64”:“ x86”;
詹森·摩尔斯

2
Environment.Is64BitProcess属性(自.NET4起)。
riezebosch 2011年

5

在我们的情况下,由于生产服务器丢失,因此无法正常工作

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

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


1
为我工作。它只是给出一条错误消息而没有指出C库丢失了,这太糟糕了。
brk

1
对我来说,我已经为System.Data.SQLite安装了vcredist 2008 x64,版本= 1.0.99.0,文化=中性,PublicKeyToken = db937bc2d44ff139
themadmax '18年

5

由于不得不在Roadkill Wiki上处理许多错误报告且问题完全相同的人,这是您需要做的:

  • 您使用的是x64还是x86?Sqlite带有用于不同体系结构的DLL-将正确的一个复制到您的bin文件夹中,正式提供程序有两个DLL:System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • 如果您不必为这些程序集而烦恼,请为您的应用程序池启用32位模式(通常仅适用于开发机的解决方案)
  • 如果您托管在服务器上,则需要重新分发Microsoft C ++运行时-默认情况下,它未安装在Server 2008 R2上。x64版本x86版本

重新分配SQLite .NET二进制文件时,您必须经历多少麻烦,这真是一个难题。我对Roadkill的最终解决方案是根据您使用的体系结构将正确的二进制文件复制到〜/ bin文件夹中。不幸的是,这不能解决C ++运行时问题。


5

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

  • 转到Visual Studio 2010,菜单->工具
  • 选择扩展管理器
  • 在搜索框中输入NuGet,然后单击Online Gallery。等待中正在检索信息…
  • 选择检索到的NuGet软件包管理器,单击下载。等待下载中…
  • 在Visual Studio扩展安装程序NuGet软件包管理器上,单击“安装”。等待安装完成。
  • 点击关闭,然后点击立即重新启动。

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

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

在这种情况下,您看到两个文件夹x64,x86,这些文件夹包含SQLite.Interop.dll。现在转到那些dll的属性窗口,并将构建操作设置为content,将Copy to output directory始终复制。

所以,这就是我的方式。

谢谢。越南胡志明市Kim Tho Pham。电子邮件:tho.phamkim@gmail.com


4

手动加载相关的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";
    }

4

Windows服务器从32位操作系统转换为64位时,出现此错误。引发错误的程序集设置为在x86模式(即32模式)下编译。我将其切换为“ Any CPU”,就成功了。您可以通过执行以下操作来更改此值:

右键单击该项目,转到 Properties -> Build -> Platform Target -> change to "Any CPU"


1
我试图使用32位System.Data.SQLite.dll并在64位cpu上运行时遇到此异常。我将平台目标从“ Any CPU”更改为“ x86”,并消除了异常。我认为,除非您要最大程度地提高性能,否则最好使用最小公分母来构建它,以便它可以在32位或64位cpu上运行。
cdavidyoung 2012年

3

我很奇怪地解决了这个问题,方法是通过Nuget GUI应用程序而不是程序包管理器控制台安装System.Data.SQLite。

通过控制台安装不包含该库需要运行的依赖项。


3

System.Data.SQLiteSystem.Data.SQLite.interop确保两个软件包的版本相同且都为x86

这是一个老问题,但是我尝试了以上所有方法。我在严格的x86项目上工作,因此没有两个文件夹/ x86,/ x64。但是由于某种原因,该System.Data.SQLite版本与的版本不同System.Data.SQLite.interop,一旦我删除了匹配的dll,该问题就解决了。


1

我想出了两种快速解决方案。要么为我工作。我认为问题是由于权限。

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

2)而不是将Elmah.dll保留在项目bin目录中。我制作了一个dll目录放入。



0

您可以删除bin调试文件夹并重新编译吗?

或检查对的项目引用System.Data.SQLite,找到它的位置,然后在反射器中打开dll。如果无法打开它,则意味着dll已损坏,您可能想要找到正确的dll或重新安装.net框架。


我尝试直接添加对System.Data.SQLite的引用(除删除bin和obj之外),并且遇到以下错误:错误1警告为错误:程序集生成-引用程序集'System.Data.SQLite.dll '针对另一个处理器MyProject
pupeno,

0

如果将IIS Express用作开发计算机上的Web服务器,我将更改为“本地IIS”。这对我有用。


0

这是一个过时的帖子,但它可能有助于某些人搜索此错误,以尝试将应用程序池的“启用32位应用程序”设置为True。那就是为我解决错误的原因。通过阅读@beckelmw答案的一些评论,我找到了这种解决方案。


0

您可能安装了错误的软件包。您需要由Microsoft生产的实现System.Data.Common提供程序模型的包。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.