2009-06-01 3 views
0

필자는 컴파일 된 JIT (즉, 호출되기 바로 직전)가 필요한 기능을 가지고 있습니다. 이것을 보장하는 속성 또는 어셈블리 설정이 있습니까? 그렇지 않다면 함수가 컴파일 된 JIT임을 어떻게 보증 할 수 있습니까?함수가 컴파일 된 JIT인지 확인하는 방법이 있습니까?

감사합니다.

편집 : 인해 누락 된 참조 된 어셈블리에

나는 충돌에서 내 응용 프로그램을 방지하기 위해이 작업을 수행 할 수 있습니다. 내 함수가 JIT로 컴파일 된 경우 try ... catch 블록에서 누락 된 어셈블리를 참조하는 함수 호출을 래핑하고 상황을 정상적으로 처리 할 수 ​​있습니다.

전체 클래스 (또는 전체 응용 프로그램)가 Jitted 될 수 있음을 이해합니다. 이는 내가 잡을 수없는 오류를 일으킬 수 있습니다.

+4

왜 그걸하고 싶습니까? –

+0

이것을 듣고 싶으면 좋겠다. – Will

답변

2

정확하게 읽으면 클래스/메서드를 처음 컴파일 할 때 발생하는 오류가 걱정됩니다. 이를 위해서는 경계에 대한 인식이 필요합니다. 이것은 여분의 레이어로 얻을 수 있습니다.

SuspectType (즉, 필수 어셈블리가로드되지 않음)에 문제가있는 경우 Scenario1() 자체의 Jitting이 실패하므로 다음의 try/catch는 유용하지 않습니다.

void Scenario1() 
{ 
    try 
    { 
    var x = new SuspectType(); 
    ... 
    } 
    catch (..) { ... }  
} 

는 그것은 존 소총의 의견에 따라, 나는 이것이 CFX를 위해 보유하고 있는지 확실하지 않습니다,

void Scenario1a() 
{ 
    try 
    { 
     Scenario1b(); 
    } 
    catch (..) { ... }  

} 

void Scenario1b() 
{ 
    var x = new SuspectType(); 
    ... 
} 

과 같이 다시 그러나 할 수있다.

0

나는 틀린 질문에 대답하고 있을지도 모르지만, 당신은 주로 어셈블리로드 실패를 가로 챌 수 있기를 원합니다 (전체 클래스는 JITted가 콜을 둘러싼 try/catch 보호대를 물리 칠 수 있지만 명시적인 가드를 사용하는 부작용입니다. around 메소드 호출).

가능한 모든 호출을 try/catch로 지정하는 대신 어셈블리 해결 실패를 감지하고 글로벌 AssemblyResolve 이벤트를 수신하고 어셈블리 로딩 실패에 응답 할 수 있습니다. 여기서 네이티브 dll의로드 실패는 다른 메커니즘으로 추적해야합니다).

static void Main() 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += OnResolveFailure; 
    //... 
} 

static Assembly OnResolveFailure(object sender, ResolveEventArgs args) 
{ 
    //Do something here... 
} 

위의 단점은 다른 곳에서 어셈블리를 찾거나 오류를 로깅하는 것 외에는 많이 할 수 없다는 것입니다. 해상도가 떨어졌을 때의 특정하고 우아한 논리는로드 실패를 잡는 방법으로 제공되지 않습니다.

+0

나는 비슷한 것을 시도했지만, 당신이 말했듯이, 오류를 기록하는 것 이외에는 그다지 할 수 없다. try ... catch (내가 지금하고있는 함수 호출을 랩핑 할 수 있다는 것은, 내가하고있는 메커니즘 (JIT 컴파일)이 실패 할 것이라는 걱정없이 내 목표이다. 감사!! – Pwninstein

0

앱이 자체적으로 해결할 수 있어야하는 것이거나 지금 당장 어떤 종류의 어셈블리로드 문제를 디버깅하고 있습니까?

후자의 경우 융합 로그를 살펴보십시오. 이것은 런타임에 어셈블리를 검색하고로드하는 하위 시스템에서 생성되는 로그입니다.

여기에 기사가 있습니다.

관련 문제