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

时间:2009-08-14 16:45:50

标签: .net sqlite elmah

18 个答案:

答案 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扩展。你可以点击这里:

  • 转到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

答案 6 :(得分:4)

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

  • 您使用的是x64还是x86? Sqlite附带了用于单独体系结构的DLL - 将正确的体系结构复制到bin文件夹,官方提供者有两个DLLS:System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • 如果你不能打扰这些程序集,请为你的应用程序池启用32位模式(通常只为开发机器的解决方案)
  • 如果您在服务器上托管,则需要Microsoft C ++ Runtime可再发行组件 - 默认情况下它不会安装在Server 2008 R2上。 x64 versionx86 version

在重新分发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.SQLiteSystem.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提供程序模型。