无法加载DLL'e_sqlite3':找不到指定的模块

时间:2017-05-05 18:36:42

标签: windows sqlite xamarin xamarin.forms sqlite-net

我有一个Xamarin Forms解决方案。我添加了sqlite-net-pcl作为所有项目的参考。它在Android上工作正常但在Windows 8.1和Windows Phone 8.1上崩溃。我有一个IOS项目,但目前我还没有OSX尝试它。

我在Windows项目中使用它来访问数据库:

using System.IO;
using SQLite;
using Xamarin.Forms;
using HelloXamarin.Windows;
using Windows.Storage;

[assembly: Dependency(typeof(SQLiteDb))]

namespace HelloXamarin.Windows
{
   public class SQLiteDb : ISQLiteDb
    {
        public SQLiteAsyncConnection GetConnection(string databaseName)
        {
            var documentsPath = ApplicationData.Current.LocalFolder.Path;
            var path = Path.Combine(documentsPath, databaseName);
            return new SQLiteAsyncConnection(path);
        }
    }
}

以下是我的推荐信:

References

尝试访问数据库时出现此异常:

'SQLite.SQLiteConnection'的类型初始值设定项引发了异常。

无法加载DLL'e_sqlite3':找不到指定的模块。 (HRESULT异常:0x8007007E)

  • at SQLitePCL.SQLite3Provider_e_sqlite3.NativeMethods.sqlite3_win32_set_directory(UInt32 directoryType,String directoryPath)
  • 在SQLitePCL.SQLite3Provider_e_sqlite3..ctor()
  • at SQLitePCL.Batteries_V2.Init()at SQLite.SQLiteConnection..cctor()

我不知道如何解决这个问题,请帮助我!

整个解决方案可在GitHub上找到: https://github.com/apspot/HelloXamarin

4 个答案:

答案 0 :(得分:1)

您需要添加SQLite扩展程序。

  1. 转到工具>扩展和更新
  2. 转到在线,然后搜索SQLite。
  3. 下载SQLite for Windows Runtime
  4. enter image description here

    1. 在Windows项目中,添加参考并确保添加扩展名。
    2. enter image description here

      同时从引用中删除Microsoft.VCLib。

答案 1 :(得分:0)

尝试引用通用Windows平台应用程序的Visual C ++ 2015 Runtime。那为我解决了。

  1. 转到参考文献
  2. 添加参考
  3. 扩展。
  4. 检查“Visual C ++ 2015 Runtime for Universal Windows Platform Apps”

答案 2 :(得分:0)

这次,问题仍然是open。因此,在他们提供可靠解决方案之前,您可以使用this work around暂时解决问题。

添加一个帮助类

using System;
using System.Diagnostics;
using System.IO;

namespace SQLitePCL
{
    public class NativeLibraryHack
    {
        public static bool Hacked { get; private set; }

        public static bool DoHack()
        {
            if (Hacked) return true;

            try
            {
                const string runtimeFolderName = "/runtimes";

                var destinationPath = typeof(SQLitePCL.raw).Assembly.Location
                    .Replace("\\", "/");
                var destinationLength = destinationPath.LastIndexOf("/", StringComparison.OrdinalIgnoreCase);
                var destinationDirectory = destinationPath.Substring(0, destinationLength) + runtimeFolderName;

                var sourcePath = new Uri(typeof(SQLitePCL.raw).Assembly.CodeBase)
                    .AbsolutePath;
                var sourceLength = sourcePath.LastIndexOf("/", StringComparison.OrdinalIgnoreCase);
                var sourceDirectory = sourcePath.Substring(0, sourceLength) + runtimeFolderName;

                if (Directory.Exists(sourceDirectory))
                    CopyFilesRecursively(new DirectoryInfo(sourceDirectory), new DirectoryInfo(destinationDirectory));
            }
            catch (Exception ex)
            {
                //Ignore Exception
                Debug.WriteLine(ex.Message);
                return false;
            }

            return (Hacked = true);
        }

        private static void CopyFilesRecursively(
            DirectoryInfo source,
            DirectoryInfo target
        )
        {
            foreach (var dir in source.GetDirectories())
                CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));

            foreach (var file in source.GetFiles())
            {
                try
                {
                    var destinationFile = Path.Combine(target.FullName, file.Name);
                    if (!File.Exists(destinationFile))
                        file.CopyTo(destinationFile);
                }
                catch (Exception ex)
                {
                    //Ignore Exception
                    Debug.WriteLine(ex.Message);
                }
            }
        }
    }
}

然后在您的数据库迁移脚本之前添加hack,我正在使用Web API 2 所以我做了RouteConfig.RegisterRoutes

    NativeLibraryHack.DoHack();

    using (KSDBContext db = new KSDBContext())
    {
        db.Database.Migrate();                 
    }

答案 3 :(得分:0)

对我来说,它是通过将ISO 3166-1 alpha 2 codes添加到可执行项目中来实现的