2013-10-29 11 views
0

내가 비주얼 스튜디오 2012에서 프로그램을 쓰고 있어요를 사용에도 불구하고, 충분히 볼 수 없습니다라고, 나는 두 개의 별도의 프로젝트에 한 쌍의 클래스가 있습니다CodeContracts 정적 검사는 다른 어셈블리의 내부 클래스의 구성원이 InternalVisibleTo

PROJECTA :

namespace Test 
{ 
    internal class A 
    { 
    private A(B b) 
    { 
     Contract.Requires(b.X != null); 
    } 
    } 
} 

ProjectB :

namespace Test 
{ 
    internal class B 
    { 
    public string X; 
    } 
} 
ProjectB에서 AssemblyInfo.cs에서

, 나는 또한이 :

[assembly: InternalsVisibleTo("ProjectA")] 

이 코드는 CodeContract 정적 분석을 사용할 때까지 컴파일됩니다. 이 시점에서 ccrewrite에서 오류가 발생합니다 : Member 'Test.B.X' has less visibility than the enclosing method Test.A.#ctor(Test.B).

내가 생각할 수있는 유일한 문제는 ProjectContent가 ProjectB의 내부를 볼 수 있다는 것을 CodeContracts가 알지 못하므로 클래스 B의 가시성이 본 컨텍스트에서 본질적으로 아무 것도 아니라고 생각하는 것입니다. 어설 션을 b != null으로 변경하더라도 괜찮을 것으로 보이지만이 인수는 물을 보유하지 않을 수도 있습니다.

누구나 Requires을 제거하거나 CodeContracts를 끄거나 B의 가시성을 변경하지 않으면이 오류를 해결할 수 있습니까?

답변

1

코드 계약은 속성의 의미를 알고하지 않습니다

[assembly: InternalsVisibleTo("ProjectA")] 

그래서는 interals가 PROJECTA 볼 수 있다는 것을 알고하지 않습니다. InternalsVisibleToAttribute는 unittesting을 쉽게하기 위해 디자인되었습니다.

서로를 알아야 할 때 서로 다른 assamblies에서 두 클래스를 구분하는 이유에 대해 생각해야합니다. 어쩌면 당신은 인터페이스와 일종의 공장으로 해결할 수 있습니다.

+0

ProjectB는 네이티브 API를 중심으로 한 thin C++/CLI 래퍼이며, ProjectA는이를 사용하는 다양한 비트와 조각입니다. ProjectA가 ProjectB를 동일한 어셈블리 인 것처럼 ProjectB를 사용할 수있게 한 다음 나중에 ILMerge와 병합하여 다른 프로젝트에서 사용할 단일 어셈블리를 만듭니다. 유닛 테스트가 InternalsVisibleTo 속성의 원래 목적이라는 것을 알지 못했습니다. 어쩌면 다시 생각할 것입니다. –

+0

또한, 왜 CodeContracts가'b! = null' 요구 사항을 허용합니까? 'b.X! = null'이 합법적이지 않은 이유는 무엇입니까? –

+0

@PhilipC 코드 계약 어설 션은 필요에 따라 다른 체크이며, 어설 션은 코드로 컴파일됩니다. 요구 사항은 컴파일 타임에 확인하는 데 사용됩니다. – Peter