2008-10-18 2 views
2

Team System API를 사용하는 작은 명령 줄 프로그램이 있습니다. 올바른 팀 시스템이 시스템에 설치되어 있지 않은 경우, 프로그램은 System.IO.FileNotFoundException와 역 추적을 인쇄뿐만 아니라 충돌 및 표준 오류 messasge 보여줍니다참조 된 어셈블리를 찾을 수 없을 때 충돌을 방지하는 방법은 무엇입니까?

XXX 문제가 발생했습니다 을 종료해야합니다. 불편을 끼쳐 드려 죄송합니다.

그냥 내 프로그램이 "Team System 2008이 필요합니다"라는 메시지를 콘솔에 출력하고 충돌하지 않고 종료하고 싶습니다.

내 C# 코드의 첫 번째 줄을 실행하기 전에이 모든로드 프로세스가 진행되고 있음을 알 수 있습니다. 이것을 제어 할 방법이 있습니까? 어셈블리 참조를 해석 할 때

답변

3

.NET 코드는 방법 별 방법으로 JITted된다. 귀하의 "기본"방법은 외부 라이브러리를 참조합니까? 내 코드의 실행 전에 내가 할 수있는,

[MethodImpl(MethodImplOptions.NoInlining)] 
static int Main() { // add "args" etc if needed 
    try { 
     return Main2(); 
    } catch (Exception ex) { 
     Console.Error.WriteLine(ex.Message); 
     return 1; 
    } 
} 
static int Main2() { // add "args" etc if needed 
    // your real code 
} 

가 나는 그것이 작동 보장 할 수 없습니다,하지만 해볼만 한 가치는 ...

+0

매력처럼 작동합니다, 감사합니다! – gooli

1

당신은 닷넷 프레임 워크에서 Override CLR Assembly Probing Logic

에 시도 할 수는 CLR 먼저 체크 GAC, 다음 특정 위치에서 응용 프로그램 디렉토리를 검색합니다. 어셈블리가 해당 위치에 없으면 CLR은 AssemblyResolve 이벤트를 발생시킵니다. AssemblyResolve 이벤트를 구독하고 Assembly.LoadFrom/LoadFile 등을 사용하여 어셈블리를 반환 할 수 있습니다.

그러나이 경우 메시지 상자를 표시 한 다음 완전히 종료하면됩니다.

0

예. 로드 할 어셈블리의 형식을 자체적으로 참조하는 형식을 처음 사용할 때 어셈블리가로드됩니다.

그래서 해결책은 API와의 모든 상호 작용을 감싸는 도우미 클래스를 만드는 것입니다. 그런 다음 try/catch에서이 래퍼 클래스에 대한 호출을 감 쌉니다. 같은

뭔가가 :

public class Program 
{ 
    static void Main() 
    { 
     try 
     { 
      WrapperClass.CallApi(...); 
     } 
     catch(FileNotFoundException) 
     { 
      ... you can e.g. show a MessageBox and exit here ... 
     } 
    } 
} 

internal class WrapperClass 
{ 
    public void CallApi(...) 
    { 
     ... you can reference types from the Team System assembly in WrapperClass 
    } 
} 
+0

감사합니다,하지만 분명히 어셈블리를로드 : 그렇다면, 고려 심지어 마인의 첫 번째 줄에 도착하지도 않습니다. – gooli

+0

예, Main 메서드에서 직접 참조하기 때문입니다. 별도의 클래스 (또는 Marc Gravell이 지적한 별도의 메서드)에서 참조하면 Main이 실행되고 예외를 catch 할 수 있습니다. – Joe

관련 문제