posted by 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")]

물론 이 에러는 어셈블리 메타정보(매니페스트)의 다른 내용이 바뀌어도 발생하지만, 개발자가 손대지 않는데 자동으로 바뀌는 것은 아니므로, 버전만 신경쓰면 될것 같다.