禁用密码锁

ADBlock阻止了网站上的某些内容

ADBlock errore

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

StackOverflow https://stackoverflow.com/questions/1278929

我已经安装ELMAH 1.1 NET 3.5的64位在我的ASP.NET项目,现在我得到这个错误(每当我试图看到任何页面):

  

无法加载文件或组件   “System.Data.SQLite,版本= 1.0.61.0,   文化=中性,   公钥= db937bc2d44ff139' 或   它的一个依赖。尝试   是为了加载一个程序与   不正确的格式。

     

说明:   期间,出现未处理的异常   当前Web的执行   请求。请检查堆栈跟踪   有关该错误的详细信息   以及它产生在代码中。

     

异常详细信息:   System.BadImageFormatException:能   不加载文件或组件   “System.Data.SQLite,版本= 1.0.61.0,   文化=中性,   公钥= db937bc2d44ff139' 或   它的一个依赖。尝试   是为了加载一个程序与   不正确的格式。

在底部

更多错误的详细信息。

我的活动解决方案平台是“任何CPU”,我在x64运行在x64的Windows 7,当然处理器。为什么我们使用这个版本ELMAH的原因是因为1.0的.Net 3.5(x86的,这是它已经编译的唯一平台)给了我们64位Windows服务器上同样的错误。

我试过编译为x86和x64,我也得到了同样的错误。我试图消除所有的编译器的输出(bin和OBJ)。最后,我已经做出了SQLite的参考DLL直接,这是没有必要的项目东西在服务器上的工作,我有这个编译器错误:

  

错误1个警告如错误:大会代 - 引用组件“System.Data.SQLite.dll”靶的不同的处理器MyProject的

任何想法是什么问题呢?

更多错误的详细信息:

  

源错误:

     

生成了未处理的异常   当前的执行过程中   Web请求。关于信息   异常的原因和发生位置   可以使用异常被识别   堆栈跟踪的下方。

     

堆栈跟踪:

     

[BadImageFormatException:无法   加载文件或程序   “System.Data.SQLite,版本= 1.0.61.0,   文化=中性,   公钥= db937bc2d44ff139' 或   它的一个依赖。尝试   是为了加载一个程序与   格式不正确。]点击   System.Reflection.Assembly._nLoad(的AssemblyName   文件名,字符串的代码库,证据   assemblySecurity,大会   locationHint,StackCrawlMark&   stackMark,布尔   throwOnFileNotFound,布尔   forIntrospection)+0点击   System.Reflection.Assembly.nLoad(的AssemblyName   文件名,字符串的代码库,证据   assemblySecurity,大会   locationHint,StackCrawlMark&   stackMark,布尔   throwOnFileNotFound,布尔   forIntrospection)+43结果   System.Reflection.Assembly.InternalLoad(的AssemblyName   assemblyRef,证据   assemblySecurity,StackCrawlMark&   stackMark,布尔forIntrospection)   +127 System.Reflection.Assembly.InternalLoad(字符串   assemblyString,证据   assemblySecurity,StackCrawlMark&   stackMark,布尔forIntrospection)   +142 System.Reflection.Assembly.Load(字符串   assemblyString)+28结果   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串   的AssemblyName,布尔starDirective)   46

     

[ConfigurationErrorsException:可能   不加载文件或组件   “System.Data.SQLite,版本= 1.0.61.0,   文化=中性,   公钥= db937bc2d44ff139' 或   它的一个依赖。尝试   是为了加载一个程序与   格式不正确。]点击   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串   的AssemblyName,布尔starDirective)   613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory()   +203 System.Web.Configuration.CompilationSection.LoadAssembly(集信息   AI)+105结果   System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection   compConfig)+178结果   System.Web.Compilation.BuildProvidersCompiler..ctor(VirtualPath   用configPath,布尔   supportLocalization,字符串   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,   文化=中性,   公钥= 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,版本= 1.0.61.0,   文化=中性,   公钥= db937bc2d44ff139' 或   它的一个依赖。尝试   是为了加载一个程序与   格式不正确。]点击   System.Web.HttpRuntime.FirstRequestInit(HttpContext的   上下文)8896783点击   System.Web.HttpRuntime.EnsureFirstRequestInit(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维基不少bug报告,这是你需要做的:

  • 您使用的x64或x86? SQLite的自带的DLL单独的架构 - 正确的复制到您的bin文件夹中,有两个DLL的官方供应商:System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • 如果你不能被围绕这些组件困扰狩猎,使32位模式为你的应用程序池(用于开发机器的溶液通常只)
  • 如果你的服务器上托管,你需要在Microsoft C ++运行时可再发行 - 这不是默认情况下,Server 2008 R2的安装。 64版本 86版本

这是屁股,你有多少跳火圈通过时重新分配SQLite的.NET二进制文件一个真正的痛苦,到底我的团队:Roadkill的解决方案是正确的二进制文件复制到基础上的〜/ bin文件夹建筑用的。不幸的是,它没有解决C ++运行问题。

我用的NuGet扩展安装System.Data.SQLite解决了这个。这个扩展可以使用的Visual Studio 2010或更高版本。 首先,你必须安装的NuGet扩展。您可以按照这里:

  • 转至Visual Studio 2010中,菜单 - >工具
  • 选择扩展管理
  • 在搜索框中输入的NuGet并点击在线画廊。等待它检索信息...
  • 选择检索到的NuGet包管理器,点击下载。等待它下载...
  • 单击安装上的Visual Studio扩展安装的NuGet包管理器。等待安装才能完成。
  • 单击关闭并“立即重新启动。

二,现在,你可以安装SQLite的:

  • 转到菜单工具 - >在Visual Studio的库包管理器 - >软件包管理器控制台。
  • 然后运行命令在包管理控制台上安装-封装System.Data.SQLite。像这样: 在包管理控制台
  • 运行命令安装-封装System.Data.SQLite

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

在的情况下,你看到两个文件夹x64和,86,这些文件夹包含SQLite.Interop.dll。现在,去那些DLL文件的属性窗口,并设置生成操作为内容,并复制到输出目录为始终复制。

所以,这就是我的方式。

感谢。 金范芹苴, 胡志明市,越南。 电子邮件: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提供者模型。

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow