2013-09-06 4 views
0

우리는 현재 C# API 인터페이스가 열려있는 프로그램을 만들고 있습니다. 우리가 지금 Invoke가 실패합니다 Test Void하려고하면, 그러나,Assembly InvokeMember try {} catch()

int[] Test = { 0, 3 }; 

private void Test() 
{ 
    Debug.Log(Test[4].ToString()); //Exception!! 
} 

컴파일 작품 : 자, 당신은 다음 C# 스크립트를 상상한다. 분명히 실패해야하지만 예외를 잡으려고합니다. 따라서 전체 애플리케이션은 동결하지 않습니다.

Assembly assembly = Assembly.LoadFrom("C:/Our/Path/To/Dll.dll"); 

Type type = assembly.GetType("ClassApplication1.Test"); 
object instance = Activator.CreateInstance(type); 

type.InvokeMember("Test", 
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreReturn, 
null, 
instance, 
null); 

이 팝업은 응용 프로그램을 디버깅하지 않고 Visual Studio 2012에 표시됩니다. 응용 프로그램을 디버깅하지 않고 완료됩니다.

nn

nn

// 편집 :

나는 Debug.Log(Test[4].ToString()); //Exception!!가 잘못하고 excetpion를 호출 할 것이라는 점을 알고있다 (!). 그것은 원했다. try {} 블록을 통해이 작업을 수행 할 수 있지만 스크립트는 타사에서 제작 한 것임을 명심하십시오. 나는 이것에 손을 대지 않아도 적어도 우리 애플리케이션은 에러를 표시하고 (richTextBox에 표시), 던지기보다는 (= 응용 프로그램 충돌) wan't하지 않습니다.

TLDR : 내 프로그램이 다운

+1

테스트의 최대 크기는 초기화하는 방법과 동일합니다. 네 번째 색인에 액세스하려고합니다 ... 원하는 번호에 따라 0 또는 1로 변경하십시오. – Botonomous

+1

'catch (Exception ex)'를 해보고 그 타입이 정말로'IndexOutOfRange'인지 또는'InvokeMember'에 의해 그 예외가 다른 것으로 싸여 있는지보십시오. –

답변

0
int[] Test = { 0, 3 }; 

이 라인 설정 Test 배열 크기 2 할 난 내 어셈블리로로드 3 자 어셈블리를 방지하려면, 그래서 유일한 항목은 당신이 걸릴 수 있습니다 그것은 :

Test[0] // == 0 
Test[1] // == 3 

그래서 Debug.Log(Test[4].ToString());은 예외를 throw합니다.

try 
{ 
    type.InvokeMember("Test", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreReturn, null, instance, null); 
} 
catch(TargetInvocationException e) 
{ 
    // e.InnerException will be IndexOutOfRangeException in your example 
} 
catch(Exception e) 
{ // one of the other exceptions 
} 

: 나는 그것을 이해한다면

try 
{ 
    Test(); 
} 
catch(IndexOutOfRangeException ex) 
{ 
    Console.WriteLine("Exception caught: {0}", ex.Message); 
} 
+0

나는 그 Debug.Log (Test [4] .ToString()); // Exception !!'이 잘못되어 excetpion을 호출합니다. 그것은 원했다. try {} 블록을 통해이 작업을 수행 할 수 있지만 스크립트는 타사에서 제작 한 것임을 명심하십시오.나는 이것에 손을 대지 않아도 적어도 우리 애플리케이션은 에러를 표시하고 (richTextBox에 표시), 던지기보다는 (= 응용 프로그램 충돌) wan't하지 않습니다. – hresult

+0

@Finn 아마도 귀하의 질문에 처음으로 언급되어 있습니다. – Botonomous

+0

죄송합니다. 편집했습니다. 생각은 이미 충분히 분명했습니다. :) – hresult

2

, 당신은 단순히 InvokeMember에 의해 던져진 예외를 catch해야합니다 Test 메서드를 호출 할 때

try/catch 블록을 사용할 필요가 그것을 잡으려고 두 번째 블록으로 이어질 수있는 모든 예외에 대해서는 MSDN을 참조하십시오. try 블록에서 모든 코드를 래핑하기를 원할 수도 있습니다. 왜냐하면 그것들도 실패 할 수 있기 때문입니다.

AppDomains도 조사해야하며, 이러한 격리를 수행하는 "올바른"방법입니다. 이들은 스스로 관리 할 수있는 것보다 더 많은 보호 기능을 제공하기 위해 CLR에 연결합니다.