문제

누구든지 만들 수 있습니까? 짧은 샘플 그렇지 않으면 깨진다 [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 은 적용되다?

나는 이것을 통해 달렸다 MSDN의 샘플 신뢰성 구성 속성을 언급하더라도 깨뜨릴 수 없습니다. 마침내 항상 부름을받는 것 같습니다.

도움이 되었습니까?

해결책

using System;
using System.Runtime.CompilerServices;
using System.Runtime.ConstrainedExecution;

class Program {
    static bool cerWorked;

    static void Main( string[] args ) {
        try {
            cerWorked = true;
            MyFn();
        }
        catch( OutOfMemoryException ) {
            Console.WriteLine( cerWorked );
        }
        Console.ReadLine();
    }

    unsafe struct Big {
        public fixed byte Bytes[int.MaxValue];
    }

    //results depends on the existance of this attribute
    [ReliabilityContract( Consistency.WillNotCorruptState, Cer.Success )] 
    unsafe static void StackOverflow() {
        Big big;
        big.Bytes[ int.MaxValue - 1 ] = 1;
    }

    static void MyFn() {
        RuntimeHelpers.PrepareConstrainedRegions();
        try {
            cerWorked = false;
        }
        finally {
            StackOverflow();
        }
    }
}

MyFN이 Jitted되면 마침내 블록에서 제한된 지역을 만들려고합니다.

  • 신뢰도가없는 경우, 적절한 제약 지역을 형성 할 수 없으므로 정기적 인 코드가 방출됩니다. 스택 오버플로 예외는 stackoverflow로 호출됩니다 (시도 블록이 실행 된 후).

  • 신뢰도 계약의 경우, 제한된 영역이 형성 될 수 있고 최종 블록의 방법의 스택 요구 사항이 MyFN으로 들어 올릴 수 있습니다. 스택 오버플로 예외는 이제 MyFN 호출에 발생합니다 (시도 블록이 실행되기 전에).

다른 팁

이 기능의 기본 드라이버는 CLR을 SQL Server 2005에 통합하기위한 SQL 서버를 지원하는 것이 었습니다. 아마도 다른 사람들이 사용하고 법적 이유로 사용할 수 있었을 것입니다.이 깊은 통합은 호스팅 API로 게시되었지만 기술 요구 사항은 SQL 서버였습니다. SQL Server에서는 MTBF가 몇 시간이 아닌 몇 달 안에 측정되며 처리되지 않은 예외가 발생했기 때문에 프로세스 재시작은 완전히 용납 할 수 없습니다.

이것 MSDN 잡지 기사 제한된 실행 환경이 구축 된 기술 요구 사항을 설명하는 가장 좋은 것일 것입니다.

신뢰도 계약은 잠재적으로 비동기 예외 (ThreadabortException, OutofMemoryException, StackoverFlowException) 측면에서 어떻게 작동 하는지를 나타내는 방법을 장식하는 데 사용됩니다. 제한된 실행 영역은 System.runtime.compilerservices.runtimeservices.prepareconstrained Regionions ()에 대한 호출이 바로 앞에있는 시도 블록의 캐치 또는 최종적으로 (또는 결함) 섹션으로 정의됩니다.

System.Runtime.CompilerServices.RuntimeServices.PrepareConstrainedRegions();
try 
{
    // this is not constrained
} 
catch (Exception e) 
{
    // this IS a CER
} 
finally 
{
    // this IS ALSO a CER
}

CER 내에서 신뢰성 계약 방법을 사용하면 두 가지 일이 발생합니다. 이 방법은 JIT에 의해 미리 준비되어있어 JIT 컴파일러가 처음 실행될 때 메모리 자체를 사용하고 자체 예외를 유발할 수있는 JIT 컴파일러를 호출하지 않도록합니다. 또한 CER 안에있는 동안 런타임은 스레드 타비로 예외를 던지지 않겠다고 약속하고 CER이 완료 될 때까지 예외를 기다릴 것입니다.

그래서 당신의 질문으로 돌아갑니다. 나는 여전히 당신의 질문에 직접 답변 할 간단한 코드 샘플을 생각해 내려고 노력하고 있습니다. 그래도 이미 짐작했듯이, 가장 간단한 샘플은 문제의 비동기 특성을 고려할 때 상당히 많은 코드를 필요로하며 SQLCLR 코드 일 가능성이 높습니다. 왜냐하면 이것이 가장 이익을 위해 CER을 사용할 환경이기 때문입니다.

디버거 아래에서 MSDN 샘플을 실행하고 있습니까? 디버거 자체가 어쨌든 실행의 특성을 변화시키기 때문에 디버거 내에서 실행할 때 CER이 기능 할 수 없다고 생각합니다.

최적화 된 릴리스 모드에서 앱을 빌드하고 실행하면 실패를 볼 수 있어야합니다.

나는 당신을위한 구체적인 예가 없지만, 나는 당신이 시도한 요점을 놓치고 있다고 생각합니다. 메소드가 항상 성공할 것이라고 말하는 요점은 실행 중에 발생하는 (예외)가 발생하는 것과 관련하여 메소드가 반환 될 때 액세스하는 데이터가 유효한 상태가되도록하기위한 단계를 수행한다는 것을 의미합니다. 시도가 없으면 .. 따라서 Cer.Success는 실제로 성공을 보장하지 않으며 개발자가 성공을 보장하고 있다고 말합니다.

Array.copyto 메소드와 관련된 성공과 MayFail 상태의 차이점에 대한 설명은이 페이지를 확인하십시오. http://weblogs.asp.net/justin_rogers/archive/2004/10/05/238275.aspx

CER 속성은 문서화 수단입니다. 그들은 어떤 상황에서 CLR이 코드를 실행하는 방법에 영향을 미치지 만, 나는 그들 (또는 부족)이 현재 버전의 .NET에서 오류를 일으키지 않을 것이라고 생각합니다.

그들은 주로 '향후 사용을 위해 예약되어 있습니다'.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top