본문 바로가기

<SQLite.Interop.dll'을(를) 로드할 수 없는경우>를 해결하며 알아보는 .NET과 네이티브 코드(dll)의 통신 절차

I'm 영서 2024. 10. 10.
반응형

 

C#에서 SQLite를 쓰다보면, 항상 동일하게 써도 해당 오류가 발생 될 때가 있는데, 그럴때마다 아주, 아주 화가난다.. SQLite.Interop.dll'을(를) 로드할 수 없습니다. 지정된 모듈을 찾을 수 없습니다. (예외가 발생한 HRESULT: 0x8007007E) 

이 에러는 왜 뜨는것이고, 어떻게 해결해야 하는지에 대해서 포스팅 해본다.

물론 급한사람들을 위해 가장 먼저 해결방법을 쓴다.. 

목차

SQLite.Interop.dll 오류 

해결방법

0. 혹시모르니 Clean과 Rebuild부터 해보자.

1. 솔루션내의 dll 확인. 

  • 가장 기본적인 절차는 솔루션 내에 불필요하게 임의로 추가한 Interop를 확인하는것이다. (임의로 추가했다면 삭제해주자)
  • 기본적으로 Sqlite를 Nuget에서 설치 후 컴파일하면 bin폴더내 Debug나 Release에 x64와 x86에 Sqlite.Interop.dll이 생성된다. (Debug모드면 Debug, Release모드면 Release에..)

이렇게 생성된다.

2. 빌드 > 구성관리자에 들어가서 프로젝트 컨텍스트를 확인한다.

  • 프로젝트 컨택스트를 확인해야 하는데, Any CPU라면 실행환경에 맞는 Interop.dll을 불러와야 하므로 , x64와 x86 두곳에 모두 Interop가 있어야만 한다.

3. 런타임 구성요소를 확인해보자 

  • 지금처럼 C로 작성된 dll을 읽어오기 위해서는 런타임 라이브러리가 필요하다.  C로 작성된 코드 내 함수들을 찾을 수 없기 때문에 에러가 발생할 수 있으므로 제어판>프로그램 추가 제거에서 확인해보자

 

4.  bin\Debug나 Release에 dll을 넣을 수 없는경우에는

  • 환경변수를 편집해주자. 시스템 환경변수 Path에 x64경로와 x86 경로를 추가해주면 읽어올 수 있다.

그래서 얘는 도데체 왜 필요한건데?

이 에러가 떳다면 아마

  1. C#에서 Sqlite를 사용했을것이며,
  2. NET Framework 사용 (특히나 오래된 버전..) 했을것이다. 

해당 오류와 같은 Interop에러는 일반적으로 C#에서 특정 라이브러리를 사용할때 나올텐데, 이는 네이티브 코드로 작성된 라이브러리를 사용하기위해서는 중간에서 중간다리 역할을 해주는 dll이 필요하기 때문이다. 

*네이티브코드에 대해서는 아래에 작성했다.

즉 내가 무엇인가 네이티브코드로 작성한 라이브러리를 사용한다면, 반드시 필요한것이다. 

 

Interop 라이브러리는 필요할까?

네이티브 코드 vs 관리코드

라이브러리는 크게 네이티브코드관리코드 두가지로 나눌 수 있다. 

  • 네이티브 코드란 운영체제의 API나 하드웨어에 가까운 코드로 C, C++등으로 작성된 코드들이며, 이 코드는 운영체제에 의존하기 때문에 .NET과 같은 관리 환경에서는 직접 실행되지 않고, 별도의 Interop가 필요하다. 
  • 관리코드란 .NET이나 Java와 같은 런타임 환경에서 실행되는 고수준의 코드로, 가비지 컬렉션과 같은 메모리 관리 기능을 런타임시 제공받으며, 운영체제에 의존하지 않는 C#, VB.NET 등으로 작성된 코드들이 해당된다.

그래서 왜 필요한데?

네이티브 코드로 작성된 라이브러리는 운영체제에 의존적이므로, .NET환경에서 이 네이티브 코드를 사용하려면 두 시스템간의 통신 매체가 필요하기 때문에 Interop.dll을 통해 네이티브 코드를 .NET 환경에서 호출할 수 있도록 다리를 놓는 역할을 한다.

특히 지금 예제로 삼은 Sqlite는 C로 작성된 네이티브 라이브러리 이기 때문에 이 라이브러리를 사용하려면 *Platform Invocation 를 사용하여 호출해야하고, 이를 위해 Interop가 필요하다.

반면 순수 관리코드로 작성된 라이브러리는 .NET에서 바로 실행되므로 Interop가 필요하지 않다. 당연하겠지만 C# 코드를 C#에 넣는데 중간에서 호환성이 필요할리가 있나... 이거다. (호환성이 필요할 수는 있긴하다..ㅎㅎ;) 주요 라이브러리를 꼽아보자면  우리의 영원한 친구 NewtonSoft.Json 과 같은 JSON 데이터 처리를 위한 라이브러리 등이 있다.

 

 

반응형

댓글