2010-11-27 3 views
4

안녕하십니까 CodeContracts 관한 약간의 문제가 있습니다. 클래스 foo (string s1, string s2) 클래스를 가진 클래스 라이브러리 프로젝트가 있습니다; foo 메소드 안에는 Contract.Requires (s1! = null)가 있습니다. 그래서 내 코드의 의미를 이해하면 (예, 방금 CodeContracts를 설치하고 함께 놀았습니다 :) 계약은 빌드 프로세스 및 런타임 중에 ArgumentException>을 던져 s1! = null 표현식을 검사합니다. 클래스 lib 프로젝트에서 foo (null, "test")를 호출 할 때 디자이너가 문제에 대해 알려주지 만 동작을 테스트하려고했지만 winform 앱 프로젝트에서 호출 할 때 경고 메시지가 표시되지 않습니다. 오류 목록 창. 그렇다면 코드 계약은 외부 프로젝트가 아닌 프로젝트에만 적용됩니다. 감사CodeContracts 문제

UPDATE

내가 추가 한 전제 조건이 정적 분석에서 작동하지 않는 것을 언급하는 것을 잊었다

. 그러나 런타임에 적절한 메시지와 함께 ArgumentException을 던집니다.

답변

6

여러분, MS 팀 덕분에 문제가 발견되었습니다. 이상한 행동의 이유는 내 어셈블리의 이름이 ".Contracts.dll"로 끝났기 때문입니다. 그리고 문제는 정적 분석기가 이름이 끝나는 어셈블리를 확인하지 않는다는 것입니다. 어셈블리의 이름을 변경하고 다른 MS 제품과 마찬가지로 모든 것이 매력처럼 작동합니다.

+2

절대 생명의 은인, 저를 미치게했습니다! –

+0

기쁘게 도와 드릴 수있었습니다 :) – Davita

+1

Thank you !! 이 경우 적어도 경고 또는 무언가를 추가해야합니다. 이 질문 이후 거의 5 년 만에이 문제는 저에게 * 시간 *을 들었습니다 ... 인터넷에서이 행동이 문서화 된 유일한 곳입니다. – Sabre

2

Perform Static Contract Checking이 winforms 프로젝트에서 선택되어 있으면이 방법이 효과적입니다. 또한 런타임 검사를 원할 경우 Perform Runtime Contract Checking이 클래스 라이브러리 프로젝트에서 선택되어 있는지 확인하십시오.

또한 클래스 라이브러리 프로젝트에서 Contract Reference AssemblyBuild으로 설정해야합니다. 코드 계약 문서에서

:

프로젝트 계약을 포함하고 다른 프로젝트에서 참조하는 경우, 저희는 귀하 께서 CodeContracts의 속성 탭에서 계약 참조 assemby 섹션에서 빌드 선택하는 것이 좋습니다.

이 계약 참조 어셈블리는 프로젝트의 계약을 참조 프로젝트에서 사용할 수있게하는 데 중요합니다. 계약 참조 어셈블리를 작성하지 않으면 다른 프로젝트에서 어떤 계약이 존재하는지 확인할 수 없습니다.

+0

답장을 보내 주셔서 감사합니다. 글쎄. 두 프로젝트 모두에서이 두 가지를 모두 확인했지만 작동하지 않습니다. 메시지 창이 표시됩니다. CodeContracts : 0 개의 어설 션을 선택했습니다. 어떤 아이디어가 있습니까? – Davita

+0

클래스 라이브러리 프로젝트에서'Contract Reference Assembly'를'Build'로 설정 했습니까? –

+0

예, 클래스 lib 프로젝트에서 빌드로 설정되었습니다. Winform 프로젝트에서 아무 것도 설정하지 않았습니다 – Davita

0

사용중인 Visual Studio 버전을 쓰지 않았습니다. AFAIK 코드 Cotnract 정적 분석은 VS Premium에서만 작동합니다 (Standard 및 Professional만으로는 충분하지 않음).