答案 0 :(得分:116)
System.Data.SQLite.dll
是一个混合程序集,即它包含托管代码和本机代码。因此,特定的System.Data.SQLite.dll
是x86或x64,但不是两者。
更新(由J. Pablo Fernandez提供):当您按F5或单击绿色“播放”按钮时,Visual Studio使用的开发Web服务器Cassini是x86只表示即使你的工作站是x64,你也只能使用x86版本的System.Data.SQLite.dll。
另一种方法是不使用Cassini,而是使用适当的x64的IIS7。
答案 1 :(得分:75)
确保应用程序池的“启用32位应用程序”设置为false。
答案 2 :(得分:42)
转到IIS7 Application Pool -> advanced settings and set the 32-bit application to true
。
答案 3 :(得分:12)
如果您不使用SQLite,这非常简单:
您可以从解决方案的bin文件夹中删除SQLite DLL,然后从引用ELMAH的文件夹中删除。重建,您的应用程序将不会尝试加载您未使用的此DLL。
答案 4 :(得分:7)
我有一个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";
}
答案 5 :(得分:4)
我通过使用Nuget扩展安装System.Data.SQLite解决了这个问题。此扩展可用于Visual Studio 2010或更高版本。 首先,您必须安装Nuget扩展。你可以点击这里:
其次,现在,您可以安装SQLite:
现在,您可以使用System.Data.SQLite。
在这种情况下,您会看到两个文件夹x64和x86,这些文件夹包含SQLite.Interop.dll。现在转到那些dll的属性窗口,并设置构建操作是内容,复制到输出目录是复制始终。
所以,这是我的方式。
感谢。 Kim Tho Pham, 越南胡志明市。 电子邮件:tho.phamkim@gmail.com
答案 6 :(得分:4)
作为一个必须在Roadkill Wiki上处理相当多错误报告并且问题完全相同的人,这就是你需要做的事情:
System.Data.SQLite.dll
System.Data.SQLite.Linq.dll
在重新分发SQLite .NET二进制文件时,你需要跳过多少箍,真是太痛苦了,我的Roadkill解决方案最终是将正确的二进制文件复制到〜/ bin文件夹中。建筑你的使用。不幸的是,这并没有解决C ++运行时问题。
答案 7 :(得分:3)
当我们的Windows服务器从32位操作系统转换为64位时出现此错误。抛出错误的程序集设置为在x86模式下编译(即32模式)。我把它切换到“任何CPU”,这就是诀窍。您可以通过执行以下操作来更改此值:
右键点击项目转到Properties -> Build -> Platform Target -> change to "Any CPU"
答案 8 :(得分:3)
手动加载相关的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)
在我们的情况下没有用,因为我们的生产服务器缺少
Microsoft Visual C++ 2010 SP1 Redistributable Package (x86)
我们安装了它,一切正常。应用程序池必须将“启用32位应用程序”设置为true,并且必须具有库的x86版本
答案 10 :(得分:2)
奇怪的是,我解决了这个问题,通过Nuget GUI应用程序安装System.Data.SQLite,而不是包管理器控制台。
通过控制台安装并不包含此库需要运行的依赖项。
答案 11 :(得分:1)
解决此问题的另一种方法是将您的应用程序升级到ELMAH 1.2而不是1.1。
答案 12 :(得分:1)
System.Data.SQLite
依赖System.Data.SQLite.interop
确保两个软件包的版本相同,并且 x86 。
这是一个老问题,但我尝试了以上所有内容。我正在开发一个严格的 x86 项目,所以没有两个文件夹/ x86,/ x64。但出于某种原因,System.Data.SQLite
与System.Data.SQLite.interop
的版本不同,一旦我删除匹配的dll,问题就解决了。
答案 13 :(得分:1)
我提出了2个快速解决方案。要么为我工作。我认为问题在于权限。
1)我没有使用net-2.0目录中的Elmah.dll文件,而是使用了net-1.1中的Elmah.dll。
2)而不是将Elmah.dll保留在项目bin目录中。我创建了一个dll目录来放入它。
答案 14 :(得分:0)
如果您在开发计算机上使用IIS Express作为Web服务器,我将更改为本地IIS。这对我有用。
答案 15 :(得分:0)
您可以删除bin调试文件夹并重新编译吗?
或者检查项目对System.Data.SQLite
的引用,找到它所在的位置,然后打开反射器中的dll。如果您无法打开它,这意味着该DLL已损坏,您可能想要找到一个正确的或重新安装.net框架。
答案 16 :(得分:0)
这是一篇旧帖子,但它可能会帮助搜索此错误的某些人尝试为应用池设置“启用32位应用程序”为True。这就是为我解决错误的原因。我通过阅读@ beckelmw回答的一些评论来找到这个解决方案。
答案 17 :(得分:0)
您可能安装了错误的软件包。您需要Microsoft产生的包,该包实现了System.Data.Common提供程序模型。