首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在LINQPad中使用Akavache?

如何在LINQPad中使用Akavache?
EN

Stack Overflow用户
提问于 2015-02-03 21:10:14
回答 3查看 624关注 0票数 4

根据平台为阿卡瓦奇编写的特定注释

.NET 4.5Desktop (WPF) --您必须将应用程序标记为x86,否则您将得到一个奇怪的运行时错误,说明SQLitePCL_Raw没有正确加载。

现在,我只是尝试在LINQPad中用简单的代码测试Akavache,该代码是按照Akavache页面上的示例代码建模的。

代码语言:javascript
复制
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?使用V4.53.16,而不是AnyCPU构建,只是普通的测试版。我在设置和Google中到处查找,但是找不到任何东西。

谢谢

*更新1 *

尝试@Joe的建议。IntPtr.Size确实是4岁。这是我在第一条await线路上遇到的例外:

代码语言:javascript
复制
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,所以我希望有一种方法可以让它与LINQPad一起工作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-29 15:47:38

@rdavisau的回答让我走上了正确的轨道,终于找到了答案。他的解决办法对我来说是行不通的。在这个答案中,Akavache 4.1.0和LINQPad 4.55.03。

帮助我的源代码是这里

一旦我看到TryLoadFromDirectory被调用,并将new Uri(AppDomain.CurrentDomain.BaseDirectory).LocalPath)作为它的位置来查找sqlite3.dll,我就能够通过在代码行中调用.Dump()来查看该位置在LINQPad中的位置。

对我来说,现在是C:\ProgramData\LINQPad\Updates40\455\。这有点不幸,因为每次LINQPad自动更新都会转到不同的目录。

因此,我在刚才找到的目录中创建了一个x86目录,然后尝试将sqlite3.dll放在NuGet包中。我不得不从LINQPad的NuGet缓存中找到它。我在这里找到了正确的答案:C:\Users\jcomtois\AppData\Local\LINQPad\NuGet\akavache.sqlite3\SQLitePCL.raw_basic.0.7.0\build\native\sqlite3_dynamic\winxp\x86\sqlite3.dll

所以现在我想我有了合适的.dll来让我的测试LINQPad程序工作。我运行了它,然后得到了The Program can't start because MSVCR110.dll is missing from your computer. Try reinstalling the program to fix this problem.的提示。记住,这台机器没有安装Visual。我去了这里,下载并安装了可再发行版。

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

一旦成功,我就尝试将x86文件夹与正确的sqlite3.dll放在LINQPad安装目录中,但这不起作用。我猜想这就是@rdavisau在他的回答中所指的意思,因为它还不清楚。

在LINQPad中运行Akavache有点痛苦,我希望它更简单,但这是可能的。

票数 1
EN

Stack Overflow用户

发布于 2015-04-29 05:04:04

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

代码语言:javascript
复制
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",它就可以工作了。

票数 2
EN

Stack Overflow用户

发布于 2015-02-04 03:59:11

X86构建的LINQPad总是在32位进程中运行查询。

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

代码语言:javascript
复制
IntPtr.Size

如果返回4,则处于32位进程中。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28308795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档