[.NET] 파일이 있는데 파일이 없다는 에러(FileNotFoundException)가 나는 경우(faet. Newtonsoft.Json)
1. 오류 발견
지정된 파일을 찾을 수 없다는 에러가 나는데 수동으로 파일을 읽어도 잘 읽어지고,
'File.ReadAllText'를 써도 잘 읽어집니다.
웃긴 건 이걸 DLL로 만들어 쓰고 있었는데 원본 테스트에서는 아무런 문제가 없고,
에러 나는 타이밍은 파일을 읽을 때가 아니고 경로를 전달할 때입니다???
System.IO.FileNotFoundException: Could not load file or assembly 'Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'. 지정된 파일을 찾을 수 없습니다. File name: 'Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' at NfcAssist.NfcInfoFile.FileLoad_CardInfo(String sNfcCardInfoFileDir) at NfcAssist.NfcInfoFile.FolderLoad_CardInfo(String sNfcCardInfoFolderDir) 예외 발생: 'System.IO.FileNotFoundException'(NfcAssistNet4.dll)
심지어 이 DLL은 여기저기서 잘 쓰고 있는 건데 말이죠;;;;
2. 원인은 경고 내용에 있다??
프로젝트에 경고가 하나 나오고 있습니다.
'Newtonsoft.Json'버전이 충돌났다는 경고입니다.
이런 건 보통 .NET에서 알아서 처리해주기 때문에 신경 안 쓰고 있었습니다.
(실제로 JSON 처리에 문제가 없는 상황이였습니다.)
경고도 에러도 'Newtonsoft.Json' 가르키고 있는데......
3. 에러를 잘 살피자
아뿔싸!
그러고 보니 'Newtonsoft.Json'을 참조하는 프로젝트에서는 별문제가 없었던 기억이 떠올랐습니다.
그래서 'Newtonsoft.Json' 13버전으로 참조했습니다.
이제 에러 없이 잘 동작합니다.
제가 만든 라이브러리도 작업 중인 프로젝트도 'Newtonsoft.Json'를 안 쓰다 보니 'Newtonsoft.Json'를 신경 쓰지 않고,
파일이 없다(System.IO.FileNotFoundException)는 에러에만 집착했네요.
아마 라이브러리가 참조하고 있는 다른 라이브러리 중에 'Newtonsoft.Json' 12버전을 참조하고 있는 게 있었던 듯합니다.
마무리
라이브러리와 작업 중인 프로젝트 간에 참조하는 대상의 버전이 안 맞는 경우 발생할 수 있는 문제이긴 합니다.
에러 위치와 내용이 이상해서 그렇지, 힌트는 있던 셈입니다.
이런 경우 프로젝트 참조를 할 때는 에러가 안 나는데 DLL만 참조하면 에러가 나거나 비정상 동작을 하는 경우가 있습니다.
이러면 디버깅이 지옥이 되는거죠 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
이것으로 알 수 있는 사실은 참조가 문제 있을 때 '참조 오류'가 아닌 '파일 없음' 오류가 날 가능성도 있다는 것입니다.