.NET 프로젝트 내에서 ClickOnce 혹은 ActiveX를 개발을 해서 배포를 함에 있어서 Strong Name이 없을 경우에는 프로젝트 빌드시에 에러가 발생한다.
"해당하는 DLL에 대해서 Strong Name이 지정되지 않았습니다" 라는 문구가 나올 것 이다.
해결 방법은 의외로 매우 간단하다. 즉, 소스코드를 다시 컴파일 해주면서 서명파일을 추가 해주면 된다.
즉, ildasm.exe를 통해서 IL코드를 추출해서 다시 컴파일을 하면 된다.
Reflector.exe를 통해서도 IL코드를 추출 할 수 있는지는 테스트는 못해 봤다.
그럼 IL코드를 추출하는 해서 다시 Assembly를 만들어 서명하는 법을 알아보도록 하자
자 일단 문제가 되는 해당 dll을 찾아 보도록 한다. Strong Name이 지정되지 않는 문제의 dll을 찾는다.
저는 Intorop.CDO.dll이 문제가 되어서 한번 해결해 보도록 했다.
일단 기존의 사용하는 snk, pfx 쌍키를 만들어 놓았다면 그것을 활용해도 되겠다.
만일 해당하는 서명파일이 없다면, 새로이 만들어 주면 된다.
Visual Studio Command를 실행 후 아래 명령을 실행한다.
명령 : sn - k sign.snk
이제 sing.snk 파일을 만들었으니 해당 문제가 되는 dll의 MSIL Code를 추출 해보도록 하자.
여기서 참고로 필자는 프로젝트는 Framework3.5 기반으로 진행을 하고 있고, 문제가 되는 dll은 Framework 1.1 기반의 dll 이기 때문에 ildasm.exe도 해당 버전에 맞는 것을 실행해야 한다.
MSIL Code 에 대해서 버전별로 조금씩 다르기 때문이다.
하지만, IL DASM은 버전에 관계없이 읽는것은 가능하다 IL코드 추출만 되지 않는다~~~
Framework 1.1 버전의 디스어셈블러
Framework 3.5 버전의 디스어셈블러
한번 dll에 대해서 역어셈블러를 통해서 구조를 보자~ 많은 클래스와 인터페이스, 메소드, 열거형 등이 보이고 있다. 이런 구조에 대해서 IL코드는 하나의 파일로 통짜로 출력 한다고 보면 된다.
즉, *.CS 코드를 Jiter가 변환한 것을 다시 가져 올 것이다.
명령 : ildasm Interop.CDO.dll /out : Interop.CDO.il
자~ 이제 IL코드가 생성이 된 폴더에 가서 해당 IL코드를 보도록 하자.
보니까 별거 없다. 디스어셈블러의 정보와 해당 DLL의 IL코드 가 보인다.
디스어셈블러로 확인 했던 개별적인 코드가 하나의 파일로 나온 것 이다.
즉, CS코드가 MSIL로 된 것을 볼 수 있다.
(개인적으로 음… IL코드를 보니 AOP를 이용해서 LOG쪽을 개발할 때 사용했던 기억이(@@);
자 이제 만들어 졌으니 다시 서명하고 얼른 dll 만들자.. 점심시간 끝나가네…)
ilasm.exe로 추출한 IL코드를 이용해서 다시 Assembly를 만든다.
명령 : ilasm Interop.CDO.dll.il /dll /key=key.snk
자~~ 결과를 확인해 봅시다. 아래와 같이 메시지가 나온다면, 정상적으로 dll이 생성이 되었습니다.
이로써 개별적인 dll에 대해서 Strong Name을 적용하는 방법을 알아 봤습니다. ^^;
앞으로도 좋은 정보 많이 공유하도록 노력 하겠습니다.
질문사항이 있으시면 연락 주시면 바로 답변 드리겠습니다.