-도입계기
기존에 구형 포스트그리DB와 통신하는 C#프로젝트가 있는데,
통신방식이 그냥 하드코딩된 sql query string을 쏘는 쉽고 단순하고 무식한 방식임.
그런데 만들어둔 query string이 구형DB와 구형 Npgsql.dll에서만 작동하여 아무튼 지금은 잘 작동하나 최신라이브러리나 DB를 못쓰고있었음.
작성되있는 쿼리문을 하나하나를 최신버전에 호환되도록 재작성하기에도 양이 너무 많아 애초에 엉망인애를 유지보수하느라 고생하고싶지 않았음.
생각해보니 EF Core를 도입하면 기존에 무식하게 쿼리문적혀있는거 싹다 없에고 호환성도 알아서 처리해줄거같음.
문제는 모든걸 일괄로 바꾸고 디버깅 하기엔 양이 너무 많은 관계로 기능별로 점진적인 마이그레이션이 가능토록 해야하는데,
일단은 EF Core에서 사용할 최신 Npgsql.dll과 구버전 쿼리문에서 사용할 Npgsql.dll 2.3.3을 동시에 작동시킬수 있어야했음.
당연히 둘다 참조를 걸면 버전 충돌이 발생하고,
같은 라이브러리를 둘다 가지고있을 방법을 찾아야 했음.
-해결방법
Aliases를 적용하여도 빌드경로의 dll 파일명이 여전히 중복되어 동시에 접근할수가 없게되고.
단순히 dll파일명을 변경해 참조해도 결국 런타임에서 읽지를 못하고 툴을 이용해야했음.
기존에 사용하던 Npgsql 2.2.3의 Nuget참조를 제거하고, dll파일들을 ILMerge툴을 이용해 합체겸 이름변경
ILMerge /out:Npg233.dll Npgsql.dll Mono.Security.dll
최신dll은 별도프로젝트에 nuget으로 받아서 참조걸고 Aliases까지 적용.
구형dll은 아까 만든 merged dll을 직접참조걸고 Aliases 적용.
실제 사용하는코드에서 extern alias 어쩌구로 접근하면 동일 namespace도 따로접근이됨.
-비고
개삽질하다 일단 된걸 적어두려는거라 깔끔하지는 못함. 아마 불필요한 과정도 끼어있을건데 어쩃든 이리 해결함.
ILMerge가 닷넷프레임워크dll이라 쓸수 있었는데 Core용 dll도 사용가능한지 모르겠음.
거짐 8개월만에 일단 전부 EF로 옮기고 레거시 dll제거 성공한 기념으로 덧글