2015-02-03 6 views
3

플랫폼에 따라 특정 음 : LINQPad에서 Akavache를 사용하는 방법? <a href="https://github.com/akavache/Akavache" rel="nofollow">Akavache</a>에 대한

.NET 4.5 데스크톱 (WPF) - 당신은 86로 응용 프로그램을 표시해야합니다, 그렇지 않으면 당신은 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으로 표시하려면 어떻게합니까? AnyCPU 빌드가 아닌 4.53.16 절을 사용하면 정상적인 베타 버전입니다. 설정과 Google에서 어디에서나 보았지만 아무것도 찾을 수 없습니다.

감사

* 업데이트 @Joe Albahari의 제안을 시도 1 *

. 내가 LINQPad의 NuGet을 통해 Akavache를 설치 한 이후


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 

, 나는 sqlite3.dll을이었다 곳을 찾기 위해 검색을 몇 가지해야 할 일을했을 : IntPtr.Size 이것은 내가 처음 await 줄에 받고있어 예외는 실제로 4입니다. 다양한 빌드에 대해 Akavache NuGet 패키지 (내 AppData/Local/LINQPad/Nuget ...) 내에서 약 15 개의 slqlite3.dll을 발견했습니다. x86 폴더의 파일을 LINQPad 디렉토리로 복사하려고 시도했지만 동일한 오류가 발생했습니다. 나는 각각의 다른 sqlite3.dll을 LINQPad 폴더에 복사하려고 시도했지만 여전히 같은 결과를 보였다.

이 컴퓨터에 Visual Studio를 설치할 수 없어서 LINQPad에서 작동하도록하는 방법이 있었으면합니다.

답변

1

@ rdavisau의 answer 마침내 이것을 알아 내기 위해 올바른 길을 찾아 왔습니다. 그의 해결책은 나에게 맞지 않았다. 이 대답에서 Akavache 4.1.0 및 LINQPad 4.55.03.

나를 도왔던 소스 코드는 here입니다.내가 TryLoadFromDirectorysqlite3.dll을 찾을 수있는 위치로 new Uri(AppDomain.CurrentDomain.BaseDirectory).LocalPath)로 호출되는 것을보고되면

는, 그 위치 코드 줄에 .Dump()를 호출하여 LINQPad에 어디에 볼 수 있었다.

현재 나를 위해, 그것은 C:\ProgramData\LINQPad\Updates40\455\이었습니다. LINQPad가 자동 업데이트되면 매번 다른 디렉토리로 이동하기 때문에 약간 불행한 일입니다.

그래서 방금 찾은 디렉토리에 x86 디렉토리를 만든 다음 NuGet 패키지에서 sqlite3.dll을 넣어 보았습니다. 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.

이제는 테스트 할 LINQPad 프로그램에 적절한 .dll이 있다고 생각합니다. 나는 그것을 달린 다음 The Program can't start because MSVCR110.dll is missing from your computer. Try reinstalling the program to fix this problem. 으으로 메시지를 받았다. 이 컴퓨터에는 Visual Studio가 설치되어 있지 않음을 기억하십시오. 나는 here으로 가서 재배포 가능 패키지를 다운로드하고 설치했다.

"모든 스레드 취소 및 재설정"을 수행 한 후 다시 테스트 코드를 실행했습니다. 성공!

이 작업이 완료되면 sqlite3.dll 폴더를 x86 폴더에 넣어 LINQPad 설치 디렉터리에 넣으려고했으나 작동하지 않습니다. @rdavisau가 대답에 언급 한 내용이 명확하지 않았으므로 가정했습니다.

LINQPad에서 Akavache를 실행하는 데 시련의 종류가 있지만, 더 쉬웠 으면 좋겠지 만 입니다.

+0

흥미 롭습니다 - BaseDirectory를 테스트했을 때 LINQPad 설치 디렉토리가 있습니다. 실제로 두 상자에서 수정을 시도 했으므로 모든 사람이 동일하다고 가정했습니다. 리플렉션에서 필자는 항상 LINQPad의 "no-installer"버전을 사용합니다. LINQPad와 관련이있을 수 있습니다. – rdavisau

0

LINQPad의 X86 빌드는 항상 32 비트 프로세스에서 쿼리를 실행합니다.

다음과 같은 쿼리를 실행하여 확인할 수 있습니다

IntPtr.Size 

을이 4를 반환하면 32 비트 프로세스에있어.

당신의 라이브러리가 SQLite를 사용한다고 언급했습니다. 그렇다면 CLR이 기본 DLL을 확인할 수 없다는 것이 문제 일 수 있습니다. SQLite의 네이티브 DLL을 LINQPad 폴더에 복사 해보십시오.이 목적으로 LINQPad.exe 복사본이있는 특수 폴더를 만들 수 있습니다. 기본적으로 영원히이 좌절 된 후

+0

내 질문에 업데이트 된 정보를 추가했습니다. 32 비트 프로세스입니다. 그러나, 어느 쪽이든 내 LINQPad 폴더에 올바른 sqlite DLL을 복사하지 않거나 문제가 아닙니다. 지금까지 행운이 없습니다. –

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 */ 
} 

I가 sqlite3.dll을 이동하면 "{linqpad을} \ 86 \ sqlite3.dll을", 그것 일 확인.

+0

당신의 대답은 무슨 일이 일어나고 있는지 파악하기 위해 올바른 길로 나를 잡았습니다. 분명히했던 것보다 더 많은 장애를 겪었 기 때문에 솔루션에 대한 자세한 답변을 추가했습니다. 저를 시작해 주셔서 감사합니다! –