首页 文章

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

提问于
浏览
118

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

无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一 . 尝试加载格式不正确的程序 . 描述:执行当前Web请求期间发生未处理的异常 . 请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息 . 异常详细信息:System.BadImageFormatException:无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一 . 尝试加载格式不正确的程序 .

底部有更多错误详情 .

我的Active Solution平台是“任何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请求期间生成了未处理的异常 . 可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息 . 堆栈跟踪:[BadImageFormatException:无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,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,Evidence assemblySecurity,StackCrawlMark&stackMark,Boolean forIntrospection)127 System.Reflection.Assembly .InternalLoad(String assemblyString,Evidence assemblySecurity,StackCrawlMark&stackMark,Boolean forIntrospection)142 System.Reflection.Assembly.Load(String assemblyString)28 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName,Boolean starDirective)46 [ConfigurationErrorsException:could not not负载fi le或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,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 context)8896783 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context)85 System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)259

18 回答

  • 1

    这是一篇旧帖子,但它可能会帮助搜索此错误的某些人尝试为应用程序池设置“启用32位应用程序”为True . 这就是为我解决错误的原因 . 我通过阅读@ beckelmw答案的一些评论来找到这个解决方案 .

  • 2

    您可能安装了错误的软件包 . 您需要Microsoft生成的包,它实现System.Data.Common提供者模型 .

  • 0

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

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

    另一种方法是不使用Cassini而是使用适当的x64的IIS7 .

  • 12

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

  • 7

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

  • 1

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

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

  • 3

    我有一个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";
            }
    
  • 0

    作为一个必须在Roadkill Wiki上处理相当多错误报告并且完全相同问题的人,这就是你需要做的事情:

    • 您使用的是x64还是x86? Sqlite附带了用于单独体系结构的DLL - 将正确的DLL复制到bin文件夹,官方提供者有两个DLLS: System.Data.SQLite.dll System.Data.SQLite.Linq.dll

    • 如果您不能为这些程序集打扰,请为您的App Pool启用32位模式(通常只为dev计算机提供解决方案)

    • 如果您需要Microsoft C Runtime可再发行组件 - 默认情况下它不会安装在Server 2008 R2上 . x64 versionx86 version

    在重新分发SQLite .NET二进制文件时你必须跳过多少箍,这真是太痛苦了,我对Roadkill的解决方案最终是根据你使用的架构将正确的二进制文件复制到〜/ bin文件夹中 . 不幸的是,这并没有解决C运行时问题 .

  • 0

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

    当我们的Windows服务器从32位操作系统转换为64位时出现此错误 . 抛出错误的程序集设置为在x86模式下编译(即32模式) . 我把它切换到“任何CPU”,这就是诀窍 . 您可以通过执行以下操作来更改此值:

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

  • 42

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

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

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

  • 3

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

    • 转到Visual Studio 2010,菜单 - >工具

    • 选择Extension Manager

    • 在搜索框中输入NuGet,然后单击“在线图库” . 等待它检索信息......

    • 选择检索到的NuGet包管理器,单击“下载” . 等待它下载...

    • 单击Visual Studio Extension Installer NuGet包管理器上的“安装” . 等待安装完成 .

    • 单击“关闭”并“立即重新启动” .

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

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

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

    所以,这是我的方式 .

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

  • 0

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

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

  • 4

    我提出了2个快速解决方案 . 要么为我工作 . 我认为问题是因为权限 .

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

    2)而不是将Elmah.dll保留在项目bin目录中 . 我创建了一个dll目录来放入它 .

  • 3

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

  • 3

    System.Data.SQLite 依赖 System.Data.SQLite.interop 确保两个软件包版本相同且均为 x86 .

    这是一个老问题,但我尝试了以上所有内容 . 我正在开发一个严格的 x86 项目,所以没有两个文件夹/ x86,/ x64 . 但由于某种原因, System.Data.SQLite 是一个不同的版本到 System.Data.SQLite.interop ,一旦我拉下匹配的dll,问题就解决了 .

  • 1

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

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

  • 116

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

相关问题