2009. 3. 6. 01:46
VS.NET으로 ASP.NET 개발을 하다보면, 다음과 같은 에러를 접할때가 있다.

ASP.NET 에러페이지
에러페이지의 내용을 요약하면 '어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다.' 이며,
이 에러는 참조당하는(참조하는이 아닌) 클래스가 있는 어셈블리의 매타정보(매니페스트)의 버전이 변경되었을때 발생한다.
겁나 어려운 말이므로 그림으로 설명하면..

프로젝트(어셈블리)가 하나인경우
한 프로젝트안에서 A클래스를 참조하는 B클래스가 있을경우, A 혹은, B클래스만 수정이 된다 하여도 빌드가 프로젝트단위(한 어셈블리)로 되기때문에 참조관계에 아무 문제가 없다.

프로젝트(어셈블리)가 두개인경우
하지만 다른 프로젝트의 클래스를 참조할때는 다르다.
프로젝트 AA를 빌드하여 어셈블리 AA.dll를 생성하고 이를 참조하는 프로젝트 BB 를 빌드하여 어셈블리 BB.dll를 생성했다.
그러면 BB.dll은 AA.dll를 참조하여 관련기능이 작동되는데, 이때 참조는 단순히 파일경로만으로 참조하는 것이 아니라 AssemblyInfo.cs(혹은 AssemblyInfo.vb) 를 참조하여 버전까지 확인을 한다.
즉 BB.dll를 빌드할때 AA.dll의 버전이 1.0.0.1 이 였는데, AA.dll에 수정사항이 생겨서 다시 빌드하여 버전이 1.0.02 로 바뀌였다면, BB.dll은 참조오류를 발생하고 그게 바로 위에 보이는 '어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다.' 이다.
쉽게 말하면, '이놈은 파일명은 같은데, 내가 알던 그놈이 아이다.' 란 에러다. (근데, 겁나 어렵게 적혀있다. ㅡ ㅡa)
관련사항을 정리해보면.
.NET은 프로젝트 단위로 AssemblyInfo.cs(혹은 AssemblyInfo.vb) 를 가지고 있다.
이 파일은 빌드해서 생성되는 어셈블리에 대한 메타정보를 담고 있는 파일로서 매니페스트라 한다.
열어보면 중간쯤 어셈블리 버전에 대한 내용이 기본값으로 다음과 같이 들어가 있다.
[assembly: AssemblyVersion("1.0.*")]
기본 주석을 보면 알겠지만 위처럼 1.0.* 라고 넣으면 빌드할때 마다 버전이 자동으로 올라간다.
그러므로 위의 그림같은 경우, AA.dll 만 빌드를 할경우 버전이 자동으로 바뀌므로 기존버전을 참조하고 있던 다른 어셈블리에서 에러가 나는 거다.
그러므로 다음처럼 고정식으로 바꾸고 수동으로 필요에 따라 버전정보를 바꿔주면 위 에러를 해결할 수 있다.
[assembly: AssemblyVersion("1.0.5.3")]
물론 이 에러는 어셈블리 메타정보(매니페스트)의 다른 내용이 바뀌어도 발생하지만, 개발자가 손대지 않는데 자동으로 바뀌는 것은 아니므로, 버전만 신경쓰면 될것 같다.