Could not load file or assembly 'System.Data.SQLite'
.NetSqliteElmah.Net Problem Overview
I've installed ELMAH 1.1 .Net 3.5 x64 in my ASP.NET project and now I'm getting this error (whenever I try to see any page):
> Could not load file or assembly > 'System.Data.SQLite, Version=1.0.61.0, > Culture=neutral, > PublicKeyToken=db937bc2d44ff139' or > one of its dependencies. An attempt > was made to load a program with an > incorrect format. > > Description: An > unhandled exception occurred during > the execution of the current web > request. Please review the stack trace > for more information about the error > and where it originated in the code. > > Exception Details: > System.BadImageFormatException: Could > not load file or assembly > 'System.Data.SQLite, Version=1.0.61.0, > Culture=neutral, > PublicKeyToken=db937bc2d44ff139' or > one of its dependencies. An attempt > was made to load a program with an > incorrect format.
More error details at the bottom.
My Active Solution platform is "Any CPU" and I'm running on a x64 Windows 7 on an x64, of course, processor. The reason why we are using this version of ELMAH is because 1.0 .Net 3.5 (x86, which is the only platform for which it's compiled) gave us this same error on our x64 Windows server.
I've tried compiling for x86 and x64 and I get the same error. I've tried removing the all compiler output (bin and obj). Finally I've made a reference to the SQLite dll directly, something that was not needed for the project to work on the server and I've got this compiler error:
> Error 1 Warning as Error: Assembly generation -- Referenced assembly 'System.Data.SQLite.dll' targets a different processor MyProject
Any ideas what the problem might be?
More error details:
> Source Error:
>
> An unhandled exception was generated
> during the execution of the current
> web request. Information regarding the
> origin and location of the exception
> can be identified using the exception
> stack trace below.
>
> Stack Trace:
>
> [BadImageFormatException: Could not
> load file or assembly
> 'System.Data.SQLite, Version=1.0.61.0,
> Culture=neutral,
> PublicKeyToken=db937bc2d44ff139' or
> one of its dependencies. An attempt
> was made to load a program with an
> incorrect format.]
> 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 load file or assembly
> 'System.Data.SQLite, Version=1.0.61.0,
> Culture=neutral,
> PublicKeyToken=db937bc2d44ff139' or
> one of its dependencies. An attempt
> was made to load a program with an
> incorrect format.]
> 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): Could not
> load file or assembly
> 'System.Data.SQLite, Version=1.0.61.0,
> Culture=neutral,
> PublicKeyToken=db937bc2d44ff139' or
> one of its dependencies. An attempt
> was made to load a program with an
> incorrect format.]
> 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): Could not
> load file or assembly
> 'System.Data.SQLite, Version=1.0.61.0,
> Culture=neutral,
> PublicKeyToken=db937bc2d44ff139' or
> one of its dependencies. An attempt
> was made to load a program with an
> incorrect format.]
> System.Web.HttpRuntime.FirstRequestInit(HttpContext
> context) +8896783
> System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext
> context) +85
> System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest
> wr) +259
.Net Solutions
Solution 1 - .Net
System.Data.SQLite.dll
is a mixed assembly, i.e. it contains both managed code and native code. Therefore a particular System.Data.SQLite.dll
is either x86 or x64, but never both.
Update (courtesy J. Pablo Fernandez): Cassini, the development web server used by Visual Studio when you press F5 or click the green «play» button, is x86 only which means that even if your workstation is x64, you'll only be able to use the x86 version of System.Data.SQLite.dll.
An alternative is not to use Cassini but IIS7 which is properly x64.
Solution 2 - .Net
Make sure that "Enable 32 - Bit Applications" is set to false for the app pool.
Solution 3 - .Net
Go to the IIS7 Application Pool -> advanced settings and set the 32-bit application to true
.
Solution 4 - .Net
This is very simple if you are not using SQLite:
You can delete the SQLite DLLs from your solution's bin folders, then from the folder where you reference ELMAH. Rebuild, and your app won't try to load this DLL that you are not using.
Solution 5 - .Net
I have a 64 bit dev machine and 32 bit build server. I used this code prior to NHibernate initialisation. Works a charm on any architecture (well the 2 I have tested)
Hope this helps someone.
Guido
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";
}
Solution 6 - .Net
I resolved this by installing System.Data.SQLite with Nuget extension. This extension can use for Visual Studio 2010 or higher. First, you have to install Nuget extension. You can follow here:
- Go to Visual Studio 2010, Menu --> Tools
- Select Extension Manager
- Enter NuGet in the search box and click Online Gallery. Waiting it Retrieve information…
- Select the retrieved NuGet Package Manager, click Download. Waiting it Download…
- Click Install on the Visual Studio Extension Installer NuGet Package Manager. Wait for the installation to complete.
- Click Close and 'Restart Now.
Second, now, you can install SQLite:
- Go to the menu TOOLS->Library Package Manager->Package Manager Console of the Visual studio.
- Then run the command Install-Package System.Data.SQLite in Package Manager Console. Like this: run the command Install-Package System.Data.SQLite in Package Manager Console
And now, you can use System.Data.SQLite.
In the case, you see two folder x64 and, x86, these folders contain SQLite.Interop.dll. Now go to the properties windows of those dlls and set build action is content and Copy to output directory is Copy always.
So, that is my way.
Thanks. Kim Tho Pham, HoChiMinh City, Vietnam. Email: [email protected]
Solution 7 - .Net
In our case didn't work because our production server has missing
Microsoft Visual C++ 2010 SP1 Redistributable Package (x86)
We installed it and all work fine. The Application Pool must have Enable 32-bit Applications set to true and you must the x86 version of the library
Solution 8 - .Net
As someone who's had to deal with quite a few bug reports on Roadkill Wiki with exactly the same issue, this is what you need to do:
- Are you using x64 or x86? Sqlite comes with DLLs for separate architectures - copy the right one to your bin folder, there are two DLLS for the official provider:
System.Data.SQLite.dll
System.Data.SQLite.Linq.dll
- If you can't be bothered hunting around for these assemblies, enable 32 bit mode for your App Pool (a solution for dev machines only usually)
- If you're hosting on a server, you'll need the Microsoft C++ Runtime redistributable - it's not installed on Server 2008 R2 by default. x64 version, x86 version
It's a real pain in the ass how many hoops you have to jump through when re-distributing the SQLite .NET binaries, my solution for Roadkill in the end was to copy the correct binaries to the ~/bin folder based on the architecture your using. Unfortunately that doesn't solve the C++ runtime issue.
Solution 9 - .Net
I got this error when our windows server was converted from 32 bit OS to 64 bit. The assembly that was throwing the error was set to compile in x86 mode (ie 32 mode). I switched it to "Any CPU" and that did the trick. You can change this value by doing the following:
right click on the project go to Properties -> Build -> Platform Target -> change to "Any CPU"
Solution 10 - .Net
Manual load related System.Data.SQLite assembly can resolve this.
Changed gatapia's Code as below:
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";
}
Solution 11 - .Net
I resolved this, oddly enough, by installing System.Data.SQLite via the Nuget GUI application, as opposed to the package manager console.
Installing via the console didn't include the dependencies this library needs to run.
Solution 12 - .Net
System.Data.SQLite
has a dependency on System.Data.SQLite.interop
make sure both packages are the same version and are both x86.
This is an old question, but I tried all the above. I was working on a strictly x86 project, so there was not two folders /x86, /x64. But for some reason, the System.Data.SQLite
was a different version to System.Data.SQLite.interop
, once I pulled down matching dlls the problem was fixed.
Solution 13 - .Net
I came up with 2 quick solutions. Either work for me. I think the problem is because of permissions.
-
Instead of using the Elmah.dll file from the net-2.0 directory, I used Elmah.dll from net-1.1 .
-
Instead of keeping Elmah.dll in the project bin directory. I make a dll directory to put it in.
Solution 14 - .Net
Another way to get around this is just to upgrade your application to ELMAH 1.2 rather than 1.1.
Solution 15 - .Net
Can you delete your bin debug folder and recompile again?
Or check your project reference to the System.Data.SQLite
, track down where it is located, then open the dll in reflector. If you can't open it, that means that the dll is corrupted, you might want to find a correct one or reinstall the .net framework.
Solution 16 - .Net
If you are using IIS Express as the web server on your development machine I would change to Local IIS. This worked for me.
Solution 17 - .Net
This is an old post, but it may help some people searching on this error to try setting "Enable 32-Bit Applications" to True for the app pool. That is what resolved the error for me. I came upon this solution by reading some the comments to @beckelmw's answer.
Solution 18 - .Net
You likely have the wrong package installed. You want the package produced by Microsoft which implements the System.Data.Common provider model.
Solution 19 - .Net
As all solutions didn't work for me, I tried this: I deleted this folder C:\Users....nuget\packages\stub.system.data.sqlite.core.netframework Then I installed System.Data.SQLite.Core from Nuget Package Manager And "wow!!!!" it works,