根据平台为阿卡瓦奇编写的特定注释
.NET 4.5Desktop (WPF) --您必须将应用程序标记为x86,否则您将得到一个奇怪的运行时错误,说明SQLitePCL_Raw没有正确加载。
现在,我只是尝试在LINQPad中用简单的代码测试Akavache,该代码是按照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?使用V4.53.16,而不是AnyCPU构建,只是普通的测试版。我在设置和Google中到处查找,但是找不到任何东西。
谢谢
*更新1 *
尝试@Joe的建议。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,所以我希望有一种方法可以让它与LINQPad一起工作。
发布于 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有点痛苦,我希望它更简单,但这是可能的。
发布于 2015-04-29 05:04:04
在基本上永远对此感到沮丧之后,我梳理了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",它就可以工作了。
发布于 2015-02-04 03:59:11
X86构建的LINQPad总是在32位进程中运行查询。
您可以通过运行以下查询来验证这一点:
IntPtr.Size如果返回4,则处于32位进程中。
您提到您的库使用SQLite。如果是这样,问题可能是CLR无法解决其本机DLL。尝试将SQLite的本机DLL复制到LINQPad文件夹中(您可以为此创建一个带有LINQPad.exe副本的特殊文件夹)。
https://stackoverflow.com/questions/28308795
复制相似问题