如何在LINQPad中使用Akavache?

时间:2015-02-03 21:10:14

标签: .net linqpad akavache

根据Akavache的平台特定说明:

  

.NET 4.5 Desktop(WPF) - 您必须将应用程序标记为x86,否则您将收到有关SQLitePCL_Raw无法正确加载的奇怪运行时错误。

现在我只是尝试使用在Akavache Github页面上的示例代码之后建模的简单代码在LINQPad中测试Akavache。

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中将我的应用程序构建目标标记为x86?使用v.4.53.16,而不是AnyCPU构建,只是正常的beta。我在设置和Google中无处不在,但找不到任何内容。

由于

*更新1 *

尝试@Joe Albahari的建议。 IntPtr.Size确实是4.这是我第一个await行的例外情况:


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包中找到了大约15种不同的slqlite3.dll(在我的AppData / Local / LINQPad / Nuget中......),用于各种构建。我尝试将x86文件夹中的那个首先复制到LINQPad目录,但是同样的错误。然后我尝试将sqlite3.dll的其他每一个复制到LINQPad文件夹,但结果仍然相同。

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

3 个答案:

答案 0 :(得分:2)

在被基本上永远沮丧之后,我梳理了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移动到&#34; {linqpad} \ x86 \ sqlite3.dll&#34;,它就可以使用AOK。

答案 1 :(得分:1)

@ rdavisau的answer让我走上正轨,最终搞清楚这一点。他的解决方案对我不起作用。这个答案中有Akavache 4.1.0和LINQPad 4.55.03。

帮助我的源代码是here

一旦我看到TryLoadFromDirectory被调用new Uri(AppDomain.CurrentDomain.BaseDirectory).LocalPath)作为查找sqlite3.dll的位置,我就可以通过调用{{1}来查看该位置在LINQPad中的位置在那行代码上。

目前对我来说,它是.Dump()。这有点不幸,因为每次LINQPad自动更新它都会转到不同的目录。

所以我在刚刚找到的目录中创建了一个C:\ProgramData\LINQPad\Updates40\455\目录,然后尝试从NuGet包中放入x86。我不得不从LINQPad的NuGet缓存中找到它。我确定在这里找到了正确的一个:sqlite3.dll

所以现在我认为我的测试LINQPad程序有正确的.dll。我跑了它然后得到C:\Users\jcomtois\AppData\Local\LINQPad\NuGet\akavache.sqlite3\SQLitePCL.raw_basic.0.7.0\build\native\sqlite3_dynamic\winxp\x86\sqlite3.dll呃的提示。请记住,此计算机未安装Visual Studio。我去了here并下载并安装了可再发行组件。

我再次运行我的测试代码(在执行“取消所有线程并重置”之后)。成功了!

一旦这个工作,我尝试将The Program can't start because MSVCR110.dll is missing from your computer. Try reinstalling the program to fix this problem.文件夹和正确的x86放在LINQPad安装目录中,但这不起作用。我认为这是@rdavisau在他的回答中提到的,因为它不清楚。

在LINQPad中运行Akavache是​​一种严峻的考验,我希望它更容易,但 可能。

答案 2 :(得分:0)

LINQPad的X86版本始终以32位进程运行您的查询。

您可以通过运行以下查询来验证这一点:

IntPtr.Size

如果返回4,则表示您处于32位进程。

您提到您的图书馆使用SQLite。如果是这样,问题可能是CLR无法解析其本机DLL。尝试将SQLite的本机DLL复制到LINQPad文件夹中(您可以为此目的创建一个带有LINQPad.exe副本的特殊文件夹。)