2012-02-23 4 views
1

나는 다른 누군가가 작성한 dll을 가지고 있으며 많은 결함이 있습니다. 이 DLL에 클래스가 하나만 정의되어 있다고 가정 해 봅시다. 이 DLL을 가져와이 클래스의 인스턴스를 만들어야합니다. DLL을 코드는 다음과 같을 수 있습니다 동적으로로드 한 DLL이 버그로 인해 프로그램이 다운되는 것을 피하는 방법

[Serializable()] 
    public class makeExceptionClass 
    { 
     public bool isStringNormalized(string aString) 
     { 
      // A null check should be performed 
      return aString.IsNormalized(); 
     } 
    } 

나는 내 프로그램은 여전히 ​​경우에도 DLL 충돌을 실행할 수 있는지 여부를 확인하는 작은 프로그램을 썼다. 이 프로그램은 단순한 개념 증명 일뿐입니다. 두 개의 인수를 취합니다. 첫 번째 인수는 어셈블리에서 DLL을 직접로드하는 데 사용되고 두 번째 인수는 충돌을 유발하는 데 사용됩니다. 프로그램의 코드는 다음

class Program 
{ 
    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")] 
    static void Main(string[] args) 
    { 
     string typeOfLoading = args[0]; 
     string crash = args[1]; 

     // Load the DLL 
     if (typeOfLoading.Equals("direct") == true) 
     { 
      Console.WriteLine("Loading directly a DLL"); 
      Assembly anAssembly = Assembly.Load("unloadableDLL"); // Directly load the DLL 
      unloadableDLL.makeExceptionClass anObject = (unloadableDLL.makeExceptionClass)anAssembly.CreateInstance("unloadableDLL.makeExceptionClass"); 

      if (crash.Equals("crash") == true) 
      { 
       bool test = anObject.isStringNormalized(null); 
      } 
      else 
      { 
       bool test = anObject.isStringNormalized("test"); 
      } 
     } 
     else if (typeOfLoading.Equals("indirect") == true) 
     { 
      Console.WriteLine("Loading indirectly a DLL"); 
      AppDomain anAppDomain = AppDomain.CreateDomain("RemoteLoaderDomain"); // Assume it does not fail; 
      Type t = typeof(unloadableDLL.makeExceptionClass); 
      unloadableDLL.makeExceptionClass anObject = (unloadableDLL.makeExceptionClass)anAppDomain.CreateInstanceAndUnwrap("unloadableDLL", t.FullName); 

      if (crash.Equals("crash") == true) 
      { 
       bool test = anObject.isStringNormalized(null); 
      } 
      else 
      { 
       bool test = anObject.isStringNormalized("test"); 
      } 
      Console.WriteLine("Unloading the domain"); 
      AppDomain.Unload(anAppDomain);     
     } 
     else 
     { 
      // don't care 
     } 

     // terminate 
     Console.WriteLine("Press any key to exit"); 
     Console.ReadKey(); 
    } 
} 

문제는 DLL이 직접 또는 응용 프로그램 도메인에로드되어있는 경우 내 프로그램에 관계없이 충돌한다는 것입니다. 저는 C#에 완전히 익숙했지만 (오늘 아침에 시작되었습니다) C++ 배경을 가지고 있습니다. 전화 주변

+0

? 예외? – BlueM

+3

MEF 및/또는 MAF 조사를 고려해보십시오. 둘 다 잠재적 인 적대적 또는 버그가있는 제 3 자 코드를 응용 프로그램에로드하고 기존 인터페이스를 통해 통신 할 수있게 해주는 프레임 워크입니다. 보다 일반적으로 : 당신은 본질적으로 어렵고 숙련 된 C# 프로그래머조차도 까다로운 작업을 시도하고 있습니다. 누군가의 C# 코딩 첫날 또는 심지어 1000 번째 날로 선택한 것이 아닙니다. 행운을 빕니다! –

+0

그래, 나는 그것을 정말로 선택하지 않았다, 나는 나의 상사에 의해 그것을 친절히 요청 받았다 : D –

답변

1

추가 시도/캐치 :

당신이 "충돌"에 의해 무엇을 의미
try 
    { 
    if (crash.Equals("crash") == true) 
    { 
     bool test = anObject.isStringNormalized(null); 
    } 
    else 
    { 
     bool test = anObject.isStringNormalized("test"); 
    } 
    } catch (Exception ex) { 
    Console.WriteLine("exception in dll call: "+ex); 
    } 
+0

안녕하세요. 그러면 앱 도메인의 목적은 무엇입니까? –

+0

내 생각 엔 NullRef 예외가 크래시가 아니라는 것입니다. 예외가 발생하여 처리해야합니다. 충돌은 액세스 위반이나 세그먼트 오류와 같이 관리되지 않는 코드에서 불법적 인 것으로 간주됩니다. 당신의 논리는 DLL의 코드가 당신에게 전혀 예외를 던질 수 없게 만듭니다. – BlueM

+0

안녕하세요. 문제를 분명히해야합니다 : 팀이 제품의 이더넷을 통해 통신을 테스트해야합니다. 팀은 NI TestStand를 사용하여 테스트를 작성합니다.
TestStand는 쓰는 DLL을 사용하지만 testStand 코드를 제어 할 수는 없습니다. 내 DLL에는 B 클래스의 멤버가 있습니다. B 형 멤버는 DLL을 사용하지 않기 때문에 제어 할 수없는 DLL에서 가져옵니다.
DLLB에서 예외가 발생하면 TestStand가 충돌합니다. TestStand는 try catch 예외 처리 기능이 없으며 내 B 멤버를 통해 DLLB를 사용한다고 생각합니다. –

관련 문제