代码之家  ›  专栏  ›  技术社区  ›  Pablo Fernandez

无法加载文件或程序集“system.data.sqlite”

  •  119
  • Pablo Fernandez  · 技术社区  · 15 年前

    我已在ASP.NET项目中安装了Elmah 1.1.NET 3.5 x64,现在出现此错误(每当我尝试查看任何页面时):

    无法加载文件或程序集 'system.data.sqlite,版本=1.0.61.0, 文化=中性, publicKeyToken=DB937BC2D44F139'或 它的一个依赖项。尝试 是用来加载程序的 格式不正确。

    描述:一个 期间发生未处理的异常 当前网站的执行 请求。请查看堆栈跟踪 有关错误的详细信息 以及代码的起源。

    异常详细信息: System.BadImageFormatException:未能 不加载文件或程序集 'system.data.sqlite,版本=1.0.61.0, 文化=中性, publicKeyToken=DB937BC2D44F139'或 它的一个依赖项。尝试 是用来加载程序的 格式不正确。

    更多错误详细信息位于底部。

    我的主动解决方案平台是“任意CPU”,我在X64的Windows7上运行,当然是在X64处理器上。之所以使用此版本的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=DB937BC2D44F139'或 它的一个依赖项。尝试 是用来加载程序的 格式不正确。]
    system.reflection.assembly.\n加载(assemblyname 文件名,字符串基本代码,证据 程序集安全性,程序集 位置提示,StackCrawlMark& 堆叠标记,布尔型 ThrowonFileNotFound,布尔值 自省)+0
    system.reflection.assembly.nload(assemblyname 文件名,字符串基本代码,证据 程序集安全性,程序集 位置提示,StackCrawlMark& 堆叠标记,布尔型 ThrowonFileNotFound,布尔值 自省)+43
    System.Reflection.Assembly.InternalLoad(assemblyName 汇编参考,证据 程序集安全性,StackCrawlMark& stackmark,布尔值用于自省) +127 System.Reflection.Assembly.InternalLoad(字符串 assemblyString,证据 程序集安全性,StackCrawlMark& stackmark,布尔值用于自省) +142系统.反射.装配.载荷(字符串 装配字符串+28
    System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串 程序集名称,布尔型StarDirective) + 46

    [配置错误例外:可以 不加载文件或程序集 'system.data.sqlite,版本=1.0.61.0, 文化=中性, publicKeyToken=DB937BC2D44F139'或 它的一个依赖项。尝试 是用来加载程序的 格式不正确。]
    System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串 程序集名称,布尔型StarDirective) +613 system.web.configuration.compilationsection.loadallassembliesFromAppDomainBindirectory()。 +203 system.web.configuration.compilationSection.loadAssembly(assemblyInfo ai)+ 105
    System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection 配置)+178
    System.Web.Compilation.BuildProvidersCompiler..ctor(虚拟路径 配置路径,布尔值 支持本地化,字符串 输出组件名称+54
    System.Web.Compilation.ApplicationBuildProvider.GetGlobalSaxBuildResult(布尔值 isprecompiledapp)+232
    System.Web.Compilation.BuildManager.CompileGlobalSAX()。 +52 system.web.compilation.buildmanager.ensureTopLevelfilesCompiled()。 + 337

    [httpexception(0x80004005):无法 加载文件或程序集 'system.data.sqlite,版本=1.0.61.0, 文化=中性, publicKeyToken=DB937BC2D44F139'或 它的一个依赖项。尝试 是用来加载程序的 格式不正确。]
    System.Web.Compilation.BuildManager.ReportTopLevelCompilationException()。 +58 system.web.compilation.buildmanager.ensureTopLevelfilesCompiled()。 +512 system.web.hostingenvironment.initialize(ApplicationManager AppManager,IApplicationHost应用程序主机, iconfigmappathfactory公司 配置应用程序工厂, 主机环境参数 软管参数+729

    [httpexception(0x80004005):无法 加载文件或程序集 'system.data.sqlite,版本=1.0.61.0, 文化=中性, publicKeyToken=DB937BC2D44F139'或 它的一个依赖项。尝试 是用来加载程序的 格式不正确。]
    system.web.httpruntime.firstrequestinit(httpcontext) 上下文)+8896783
    system.web.httpruntime.ensurePrefirsTrequestInit(httpContext) 语境)+ 85
    system.web.httpruntime.processRequestInternal(httpWorkerRequest) WR)+ 259

    18 回复  |  直到 6 年前
        1
  •  116
  •   Anton Tykhyy    15 年前

    System.Data.SQLite.dll 是一个混合程序集,即它同时包含托管代码和本机代码。因此 system.data.sqlite.dll文件 是x86或x64,但不能同时使用两者。

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

    另一种选择是不使用卡西尼,而是使用适当的X64的IIS7。

        2
  •  75
  •   beckelmw    15 年前

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

        3
  •  42
  •   CoolBeans Jeremy    13 年前

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

        4
  •  12
  •   Christopher    12 年前

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

    您可以从解决方案的bin文件夹中删除sqlite dll,然后从引用elmah的文件夹中删除。重新生成,您的应用程序将不会尝试加载您不使用的此dll。

        5
  •  7
  •   gatapia    14 年前

    我有一个64位的dev机器和32位的build服务器。在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";
            }
    
        6
  •  4
  •   Niklas Wulff Jan Hermann    11 年前

    作为一个不得不在roadkill wiki上处理大量bug报告的人,你需要做的是:

    • 您使用的是X64还是X86?sqlite附带用于单独体系结构的DLL-将正确的一个副本复制到bin文件夹中,官方提供程序有两个DLL: System.Data.SQLite.dll System.Data.SQLite.Linq.dll
    • 如果您不必费心四处寻找这些程序集,请为您的应用程序池启用32位模式(通常仅适用于开发人员计算机的解决方案)
    • 如果您在服务器上托管,则需要微软C++RunTimeAddioDebug——默认情况下它没有安装在服务器2008 R2上。 x64 version , x86 version

    当重新分发sqlite.net二进制文件时,你需要跳多少圈才行,这真是个麻烦。最后,我的roadkill解决方案是根据你使用的架构将正确的二进制文件复制到~/bin文件夹中。不幸的是,这并不能解决C++运行时问题。

        7
  •  4
  •   Kim Thọ Phạm    8 年前

    我通过安装带有nuget扩展名的system.data.sqlite解决了这个问题。此扩展可用于Visual Studio 2010或更高版本。 首先,您必须安装nuget扩展。您可以在这里:

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

    其次,现在可以安装sqlite:

    现在,您可以使用system.data.sqlite。

    在这种情况下,您会看到两个文件夹x64和x86,这些文件夹包含sqlite.interop.dll。现在转到这些DLL的属性窗口,并设置build action is content,copy to output directory is copy always。

    所以,这就是我的方式。

    谢谢。 Kim Tho Pham 越南霍奇明市。 电子邮箱:tho.phamkim@gmail.com

        8
  •  3
  •   lxwwqw    13 年前

    手动加载相关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";
        }
    
        9
  •  3
  •   CoolBeans Jeremy    13 年前

    当我们的Windows服务器从32位操作系统转换为64位操作系统时,出现了这个错误。引发错误的程序集被设置为在x86模式(IE 32模式)下编译。我把它换成了“任何CPU”,这就成功了。可以通过执行以下操作更改此值:

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

        10
  •  3
  •   Marcos Meli    12 年前

    在我们的案例中,由于生产服务器丢失而无法工作

    Microsoft Visual C++ 2010 SP1 Redistributable Package (x86)

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

        11
  •  2
  •   JMK    9 年前

    奇怪的是,我通过nuget gui应用程序安装了system.data.sqlite,而不是包管理器控制台解决了这个问题。

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

        12
  •  1
  •   Anon    13 年前

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

    1)我没有使用net-2.0目录中的elmah.dll文件,而是使用net-1.1中的elmah.dll。

    2)而不是将elmah.dll保存在项目bin目录中。我创建了一个dll目录将其放入。

        13
  •  1
  •   Peter Bernier    12 年前

    另一种解决方法是将应用程序升级到Elmah1.2而不是1.1。

        14
  •  1
  •   Stacker-flow    8 年前

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

    这是一个古老的问题,但我尝试了以上所有的方法。我正在严格地 x86 项目,因此没有两个文件夹/x86,/x64。但出于某种原因, 系统.data.sqlite 不同于 system.data.sqlite.interop 一旦我删除了匹配的DLL,问题就解决了。

        15
  •  0
  •   Graviton    15 年前

    你能删除你的bin调试文件夹然后重新编译吗?

    或者检查项目引用 System.Data.SQLite ,跟踪它所在的位置,然后在Reflector中打开dll。如果无法打开它,这意味着DLL已损坏,您可能需要找到正确的DLL或重新安装.NET框架。

        16
  •  0
  •   user2088552    9 年前

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

        17
  •  0
  •   MichaelD    6 年前

    这是一篇旧文章,但它可能会帮助一些搜索此错误的人尝试将应用程序池的“启用32位应用程序”设置为true。这就是为我解决错误的原因。我通过阅读对@beckelmw答案的评论得出了这个解决方案。

        18
  •  0
  •   pim    6 年前

    您可能安装了错误的包。你想要包装由 Microsoft 实现了System.Data.Common提供程序模型。