.net - 如何在 LINQPad 中使用 Akavache?

标签 .net linqpad akavache

根据 Akavache 的平台特定说明:

.NET 4.5 Desktop (WPF) - You must mark your application as x86, or else you will get a strange runtime error about SQLitePCL_Raw not loading correctly.



现在我只是想在 LINQPad 中测试 Akavache使用以 Akavache Github 页面上的示例代码为模型的简单代码。
async void Main()
{
    BlobCache.ApplicationName = "JonTestApp1";
    var dt = DateTime.Now;
    await BlobCache.UserAccount.InsertObject("Test1", dt);
    var toaster = await BlobCache.UserAccount.GetObject<DateTime>("Test1");
    toaster.Dump();
}

可以预见的是,它正在爆炸。

如何在 LINQPad to x86 中标记我的应用程序构建目标?使用 v. 4.53.16,不是 AnyCPU 版本,只是普通的测试版。我在设置和谷歌中到处找,但找不到任何东西。

谢谢

* 更新 1 *

尝试@Joe Albahari 的建议。 IntPtr.Size确实是 4。这是我在第一个 await 上遇到的异常(exception)情况。线:

System.TypeInitializationException: The type initializer for 'NativeMethods' threw an exception. ---> System.Exception: sqlite3.dll was not loaded.
   at SQLitePCL.SQLite3Provider.NativeMethods..cctor()
   --- End of inner exception stack trace ---
   at SQLitePCL.SQLite3Provider.NativeMethods.sqlite3_open_v2(Byte[] filename, IntPtr& db, Int32 flags, Byte[] vfs)
   at SQLitePCL.SQLite3Provider.SQLitePCL.ISQLite3Provider.sqlite3_open_v2(String filename, IntPtr& db, Int32 flags, String vfs)
   at Akavache.Sqlite3.Internal.SQLiteConnection..ctor(String databasePath, SQLiteOpenFlags openFlags, Boolean storeDateTimeAsTicks)
   at Akavache.Sqlite3.Internal.SQLiteConnection..ctor(String databasePath, Boolean storeDateTimeAsTicks)
   at Akavache.Sqlite3.SQLitePersistentBlobCache..ctor(String databaseFile, IScheduler scheduler)
   at Akavache.Sqlite3.Registrations.c__DisplayClass6.b__2()
   at System.Lazy`1.CreateValue()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Lazy`1.get_Value()
   at Akavache.Sqlite3.Registrations.c__DisplayClass6.b__3()
   at Splat.ModernDependencyResolver.GetService(Type serviceType, String contract) in z:\code\paulcbetts\splat\Splat\ServiceLocation.cs:line 223
   at Splat.DependencyResolverMixins.GetService[T](IDependencyResolver This, String contract) in z:\code\paulcbetts\splat\Splat\ServiceLocation.cs:line 138
   at Akavache.BlobCache.get_UserAccount()
   at UserQuery.d__0.MoveNext() in c:\Users\jcomtois\AppData\Local\Temp\LINQPad\_qizvxzkh\query_rjuuom.cs:line 45

由于我通过 LINQPad 的 NuGet 安装了 Akavache,因此我不得不进行一些搜索以找出 sqlite3.dll 的位置。我在 Akavache NuGet 包中(在我的 AppData/Local/LINQPad/Nuget... 中)发现了大约 15 个不同的 slqlite3.dll,用于各种构建。我尝试先将 x86 文件夹中的那个复制到 LINQPad 目录,但同样的错误。然后我尝试将每个其他 sqlite3.dll 复制到 LINQPad 文件夹,但结果仍然相同。

我无法在这台机器上安装 Visual Studio,所以我希望有一种方法可以让它与 LINQPad 一起使用。

最佳答案

在基本上永远对此感到沮丧之后,我梳理了 sqlite3_raw 依赖项并发现了这一点:

private static bool TryLoadFromDirectory(string dllName, string baseDirectory)
{
    /* snip */

    var architecture = IntPtr.Size == 4 ? "x86" : "x64";
    var dllPath = System.IO.Path.Combine(baseDirectory, architecture, dllName);
    if (!System.IO.File.Exists(dllPath))
    {
        return false;
    }

   /* snip - loads the dll */
}

一旦我将 sqlite3.dll 移动到“{linqpad}\x86\sqlite3.dll”,它就可以正常工作了。

关于.net - 如何在 LINQPad 中使用 Akavache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28308795/

相关文章:

c# - 如果设置了所有属性,如何进行单元测试。没有重复

.net - 通用 DI 容器包装器并与通用框架和应用程序一起使用

c# - 为 asp.net 应用程序实现隐形 Google reCaptcha?

c# - 如何像Linqpad一样将linq结果导出到excel

android - Akavache 没有这样的表 : SchemaInfo

ios - akavache 不在 ios 模拟器/设备中缓存

.net - 是否可以在高级安装程序中将某些命令执行前后的文件从安装程序复制到用户计算机?

c# - Linq to Entities 多对多连接

c# - LINQPad Dump(toDataGrid) 直到执行结束才显示

akavache - 如何在 Akavache 中指定 DownloadURL() 的 HTTP 超时?