.NET에서 http://system.data.sqlite.org를 사용하는 경우 64bit O/S에서 System.BadImageFormatException이 발생하게 됩니다. 에러 메시지는 다음과 같습니다.


사용자 코드에서 System.BadImageFormatException이(가) 처리되지 않았습니다.
  Message=프로그램을 잘못된 형식으로 로드하려고 했습니다. (예외가 발생한 HRESULT: 0x8007000B)
  Source=System.Data.SQLite
  StackTrace:
       위치: System.Data.SQLite.UnsafeNativeMethods.sqlite3_config(Int32 op, SQLiteLogCallback func, IntPtr pvUser)
       위치: System.Data.SQLite.SQLite3.SetLogCallback(SQLiteLogCallback func)
       위치: System.Data.SQLite.SQLiteLog.Initialize()
       위치: System.Data.SQLite.SQLiteConnection..ctor(String connectionString)

       ...(중략)
       위치: System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
       위치: System.Threading.ExecutionContext.runTryCode(Object userData)
       위치: System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
       위치: System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       위치: System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       위치: System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
       위치: System.Windows.Forms.Control.InvokeMarshaledCallbacks()
  InnerException:


이 경우 빌드옵션에서 플랫폼 대상을 'x86'으로 설정해주세요. 하지만 일부 다른 사람들은 'Any CPU'로 바꿔서 해결이 되었다는 경우도 있으니 'x86'으로 안되면 모든 옵션을 시도해 보세요. 자세한 설정 방법은  http://westzero.net/106 여기를 참조하세요.

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
by 서영아빠 2012/04/30 11:28
에러 메시지 & 스택 트레이스
System.BadImageFormatException이(가) 처리되지 않았습니다.
  Message=은(는) 올바른 Win32 응용 프로그램이 아닙니다. (예외가 발생한 HRESULT: 0x800700C1)
  Source=mscorlib
  StackTrace:
       위치: System.Reflection.Assembly._nGetEntryPoint()
       위치: System.Reflection.Assembly.get_EntryPoint()
       위치: Microsoft.VisualStudio.HostingProcess.HostProc.GetEntryPointAptThreadState(String assemblyFile)
       위치: Microsoft.VisualStudio.HostingProcess.HostProc.RunParkingWindowThread()
       위치: System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       위치: System.Threading.ThreadHelper.ThreadStart()
  InnerException:

64bit O/S에서 프로젝트 빌드시 위와 같은 에러 메시지가 발생하면 빌드옵션에서 플랫폼 대상을 x86으로 설정해주세요.


이제 다시 빌드하시면 됩니다.
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
by 서영아빠 2012/02/20 13:19



저는 현재 .NET 4.0을 사용하고 있습니다. 하지만 프로젝트를 진행하다보면 하위버전의 DLL들을 사용하게 되는 경우가 종종 발생합니다.

몇 일전 저도 .NET 4.0에서 SqlLite.NET을 사용하려다가 이런 에러를 만났습니다.

System.IO.FileLoadException이(가) 발생했습니다.

  Message=혼합 모드 어셈블리는 런타임의 버전 'v2.0.50727'에 대해 빌드되며 추가 구성 정보 없이 '4.0' 런타임에 로드할 수 없습니다.

  Source=SqliteTest

  StackTrace:

       위치: SqliteTest.Form1.FastInsertMany()

       위치: SqliteTest.Form1.simpleButton2_Click(Object sender, EventArgs e) 파일 D:\TestBed\SqliteTest\Form1.cs:줄 126

  InnerException: 

 
뭐 메시지만 봐도 버전문제인줄 알겠더군요. 하지만 문제는 해결책이 옵션하나 바꾸는게 아니라는겁니다. 대부분은 그냥 VisualStudio에서 설정만 바꾸면 되게 해놓았으면서 이 문제는 옵션이 없더군요.

이 문제를 해결하기 위해서는 app.config 파일의 설정을 직접 바꿔줘야 합니다.

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

   <startup useLegacyV2RuntimeActivationPolicy="true">

      <supportedRuntime version="v4.0"/>

   </startup>

</configuration>


빨간 글씨가 바뀐 부분입니다. 이렇게 바꿔주고 다시 빌드하시면 이제 정상적으로 돌아가는 프로그램을 볼 수 있습니다.^^
 


참고: http://msdn.microsoft.com/ko-kr/library/w4atty68.aspx  
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
by 서영아빠 2011/10/20 12:40
출처 : http://msdn.microsoft.com/en-us/library/bb386947.aspx#DefaultTypeMapping

.NET에서 사용되는 형식과 SQL-Server에서 사용되는 타입의 맵핑 테이블입니다.
매번 MSDN을 찾기가 번거로워서 가져다 놨습니다.^^;;



저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
by 서영아빠 2011/03/21 15:46
| 1 |