2월, 2023의 게시물 표시

DllNotFoundException: DLL 'SQLite.Interop.dll'

이미지
  프로젝트 빌드 중  DllNotFoundException: DLL 'SQLite.Interop.dll'  에러가 발생해 해결 방법을 찾아보니, SQLite.Interop.dll을 배포시 첨부하라는 답변을 얻었습니다.   문제는, 이렇게 할 경우 AnyCPU 구성을 사용하기 불편 해집니다.   방법이 없나 찾다가 패키지 폴더 구조를 봤더니 다음과 같이 되어 있었습니다. 1. SQLite.Interop.dll 상위 디렉토리   각 플랫폼 폴더 안에 SQLite.Interop.dll이 들어가 있는 식이죠.   지금까지는 파워쉘 스크립트를 작성해 빌드 후 이벤트에서 호출하고, 플랫폼에 맞는 DLL을 복사하는 방식으로 진행하고 있었는데, 혹시나 하여 그냥 저 폴더 자체를 갖다가 넣어보니 구성을 x86이나 x64로 지정하지 않고 AnyCPU로 두어도 잘 작동하더군요. 프로젝트에 포함된 SQLite.Interop.dll 출력 디렉토리에 복사를 사용해 자동 복사 (폴더 구조까지) 출력 디렉토리에 복사된 모습   이대로 실행하면 AnyCPU 구성에서도 정상적으로 로드하는 것을 확인 할 수 있었습니다.   어찌 된 일인가 찾아보니, 스택 오버플로우에 잘 정리된 글 이 있었습니다. SQLite가 알아서 현재 플랫폼에 맞는 바이너리를 x86, x64 폴더 중에서 선택해 로드한다고 합니다.

WPF의 컨버터가 호출되지 않을 때 체크해보세요.

  제 경우에는 BoolToVisibilityConverter를 만들어서 쓰고 있었습니다. LambdaConverters 패키지를 사용해 간편하게 만들어서요.   해당 컨버터는 bool   소스의 값을 bool ConverterParameter 에 따라 Visibility 로 변경해주는 역할을 합니다.   패러미터가 true일 때엔 소스가 true 라면 Visible , 아니라면 Collapsed 를 반환하지만   패러미터가 false일 때엔 반대로 소스가 true 라면  Collapsed , 아니라면 Visible 을 반환하는 식입니다.   문제는, 이 컨버터를 사용하려 할 때에 발생했습니다. <DataGrid Binding="{IsRecordExists}", Converter="{x:Static cvt:VisibilityConverters.BoolToVisibilityConverter}", ConverterParameter=True} />   위와 같이 작성하고 테스트를 해보았으나 의도한 바와 전혀 다르게 작동하는 모습을 보였습니다.   왜 의도한 것과 다르게 작동하는지 알아보기 위해 이것 저것 테스트하다가, 컨버터의 Convert 메서드쪽에 브레이크포인트를 걸고 디버그를 돌려보니, 아예 Convert 메서드 쪽으로 진입조차 하지 않는 것을 확인하게 되었죠. 소리 없는 암살자   이건 제가 LambdaConverter 패키지를 사용해서 생긴 문제일 수도 있습니다만, 아무튼 정말 아무런 메세지도, 경고도, 에러도 없이 그냥 메서드 자체가 호출되지 않고 넘어가더군요.   이는 생각보다 심각한 문제였습니다. 에러도 없고 경고도 없어서 이것 저것 쓸데 없는 오만가지를 다 건드리다가 심지어 WPF의 버그인가? 라는 생각도 잠시 스쳐 들 정도였으니까요.   아무튼 그래서 왜 그럴까... 하고 생각하다가 문득 떠오른 것이 있었습니다. 패러미터는 기본적으로 string 형식이다   제가 만든 다른 컨버터에서는 패러미터로 st