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

无法加载文件或汇编'system.data.sqlite,版本= 1.0.61.0,文化=中性,publicKeyToken = db937bc2d444ff139'或其依赖项之一。尝试使用不正确的格式加载程序。

描述:在执行当前Web请求期间发生了一个未经治疗的例外。请查看堆栈跟踪,以获取有关该错误以及代码中何处的更多信息。

异常详细信息:系统.BadImageFormatException:无法加载文件或汇编'system.data.sqlite,版本= 1.0.61.0,文化=中性,publicKeyToken = db937bc2d444ff139'或其依赖项之一。尝试使用不正确的格式加载程序。

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

我的 Active Solution 平台是“任何 CPU”,我在 x64 Windows 7 上运行,当然是 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 = db937bc2d444ff139'或其依赖项之一。试图加载具有不正确格式的程序。
System.Reflection.sembly._nload(assemblyName FileName,字符串代码库,证据汇编级别,汇编位置,stackcrawlmark和Stackmark,boolean throwonfilenotfound,boolean forintropsection)+0
System.Reflection.Sembly.Nload(assemblyName FileName,字符串代码库,证据汇编,汇编位置,stackcrawlmark和Stackmark,boolean thrownfilenotfound,boolean foreintrosection)+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.加载(字符串汇编)+28
system.web.configuration.compilationsection.ploadAssemblyHelper(字符串组装名称,布尔式标题)+46

[配置错误异常:无法加载文件或汇编'system.data.sqlite,版本= 1.0.61.0,文化=中性,publicKeyToken = db937bc2d444ff139'或其依赖项之一。试图加载具有不正确格式的程序。
system.web.configuration.compilationsection.pilassemblyHelper(字符串indepblyName,boolean stardirective)+613 system.web.configuration.compilation.compilationsection.pilallationsection.plomappdomainbbliesfromappdomainbilliesfromappdomainbindirectory()
system.web.compilation.buildmanager.getRefrefendedAssemblies(compilations compconfig)+178
system.web.compilation.buildproviderscompiler..ctor(VirtualPath Configpath,boolean supportLocalization,string utputAssemblyName)+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,版本= 1.0.61.0,文化=中性,publicKeyToken = db937bc2d444ff139'或其依赖项之一。试图加载具有不正确格式的程序。
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,版本= 1.0.61.0,文化=中性,publicKeyToken = db937bc2d444ff139'或其依赖项之一。试图加载具有不正确格式的程序。
system.web.httpruntime.firstrequesinit(httpcontext上下文)+8896783
system.web.httpruntime.ensurefirstrequrestinit(httpcontext上下文)+85
system.web.httpruntime.processrequestinternal(httpworkerrequest wr)+259

有帮助吗?

解决方案

System.Data.SQLite.dll是混合组件,即,它同时包含托管代码和本地代码。因此特定System.Data.SQLite.dll是x86或x64,但不可能兼顾。

更新(礼貌J.费尔南德斯巴勃罗的):卡西尼号,由Visual Studio使用,当你按下F5键或点击绿色的«发挥»按钮开发网络服务器,是86只,这意味着,即使你的工作站是64,你将只能使用System.Data.SQLite.dll的x86版本。

一个替代方案是不使用卡西尼但IIS7这是正确的x64

其他提示

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

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

此,如果不使用SQLite是非常简单的:

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

我有一个64位dev的机器和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";
        }

作为一个在 Roadkill Wiki 上处理过相当多具有完全相同问题的错误报告的人,这就是你需要做的:

  • 您使用的是 x64 还是 x86?Sqlite 附带了用于单独架构的 DLL - 将正确的 DLL 复制到您的 bin 文件夹中,官方提供程序有两个 DLL: System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • 如果您懒得四处寻找这些程序集,请为您的应用程序池启用 32 位模式(通常仅适用于开发计算机的解决方案)
  • 如果您在服务器上托管,则需要 Microsoft C++ Runtime 可再发行组件 - 默认情况下,它未安装在 Server 2008 R2 上。 x64版本, x86版本

重新分发 SQLite .NET 二进制文件时,你必须跳过多少个圈子,这真的很痛苦,我最终的 Roadkill 解决方案是根据你使用的架构将正确的二进制文件复制到 ~/bin 文件夹。不幸的是,这并不能解决 C++ 运行时问题。

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

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

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

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

在本例中,您会看到两个文件夹 x64 和 x86,这些文件夹包含 SQLite.Interop.dll。现在转到这些 dll 的属性窗口,并将构建操作设置为内容,将复制到输出目录设置为始终复制。

所以,这就是我的方式。

谢谢。Kim Tho Pham,越南Hochiminh City。电子邮件:tho.phamkim@gmail.com

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

我得到这个错误时,我们的窗口服务器从32位操作系统转换为64位。这是引发错误的组件被设置在86模式(即,32模式)进行编译。我把它切换到“任何CPU”,而没有的伎俩。您可以通过执行以下更改此值:

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

我解决了这个,奇怪的是,通过经由GUI的NuGet应用安装System.Data.SQLite,相对于包管理控制台。

经由控制台安装没有包括这个库需要运行的依赖关系。

我想出了2个快速解决方案。无论是为我工作。我认为这个问题是因为权限。

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

2)代替保持Elmah.dll在项目bin目录。我做一个DLL目录把它放在

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

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

这是一个老问题,但我尝试了所有上述内容。我工作在一个严格的 86 的项目,所以有没有两个文件夹/ 86,/ 64。但由于某些原因,System.Data.SQLite是一个不同的版本System.Data.SQLite.interop,有一次我拉下来的DLL匹配问题得到了解决。

您可以删除你的bin debug文件夹中,并重新编译?

或检查项目参考System.Data.SQLite,追查所在,然后在反射器打开该DLL。如果你不能打开它,这意味着该DLL已损坏,您可能希望找到一个正确的或重新安装.NET Framework。

如果您使用的是IIS Express作为开发机器上的Web服务器我会切换到本地IIS。这为我工作。

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

您可能有错误的包安装。您想在微软产生的包,它实现了System.Data.Common提供者模型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top