내가 비주얼 스튜디오 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
의 가시성을 변경하지 않으면이 오류를 해결할 수 있습니까?
ProjectB는 네이티브 API를 중심으로 한 thin C++/CLI 래퍼이며, ProjectA는이를 사용하는 다양한 비트와 조각입니다. ProjectA가 ProjectB를 동일한 어셈블리 인 것처럼 ProjectB를 사용할 수있게 한 다음 나중에 ILMerge와 병합하여 다른 프로젝트에서 사용할 단일 어셈블리를 만듭니다. 유닛 테스트가 InternalsVisibleTo 속성의 원래 목적이라는 것을 알지 못했습니다. 어쩌면 다시 생각할 것입니다. –
또한, 왜 CodeContracts가'b! = null' 요구 사항을 허용합니까? 'b.X! = null'이 합법적이지 않은 이유는 무엇입니까? –
@PhilipC 코드 계약 어설 션은 필요에 따라 다른 체크이며, 어설 션은 코드로 컴파일됩니다. 요구 사항은 컴파일 타임에 확인하는 데 사용됩니다. – Peter