根据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一起使用。
答案 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)
帮助我的源代码是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副本的特殊文件夹。)