2012-02-23 4 views
1

私は他の人が書いたdllを持っていて、それには多くの欠陥があります。このDLLに定義されているクラスが1つしかないとします。このDLLをインポートしてこのクラスのインスタンスを作成する必要があります。 は、DLLのコードは、次のことがありますDLLが動的にロードされているためにプログラムがクラッシュするのを避けるには

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

私は、DLLがクラッシュした場合、私のプログラムがまだでも実行できるかどうかをチェックするための小さなプログラムを書きました。このプログラムは概念の証明に過ぎません。 2つの引数をとります。最初はアセンブリからDLLを直接ロードするために使用され、2つ目はクラッシュを引き起こすために使用されます。 プログラムのコードは以下の通りです:

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を直接またはのAppDomainにロードされている場合、私のプログラムは関係なく、クラッシュしたということです。 私はC#を完全に新しくしました(私は今朝始めました)が、私はC++のバックグラウンドを持っています。あなたの呼び出しの周り

+0

?例外? – BlueM

+3

あなたはMEFやMAFを調べることを検討するかもしれません。どちらも、アプリケーションに潜在的に敵対的またはバグのある第三者コードをロードし、確立されたインターフェイスを介して通信するためのフレームワークです。より一般的には、本質的に困難な作業を経験している経験豊富なC#プログラマーでさえ、手間がかかります。誰かがC#コーディングの最初の日、あるいは1000日目に選んだのは私が選んだものではありません。がんばろう! –

+0

私は実際にそれを選んだことはありませんでした。私は上司によって親切にそれをするように求められました:D –

答えて

1

追加のtry/catch:

あなたは "クラッシュ" の意味は何
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

こんにちは。その後、appDomainの目的は何ですか? –

+0

私の推測では、NullRef例外はクラッシュではありません。その例外が発生し、それを処理する必要があります。クラッシュは、アクセス違反またはセグメント違反のような管理されていないコードで起こった違法なものとみなされます。あなたのロジックは、DLL内のコードが例外を投げることを防ぐことができます。 – BlueM

+0

こんにちは。私は問題を明確にしなければなりません。チームは製品のイーサネットを通じて通信をテストする必要があります。チームはNI TestStandを使用してテストを記述します。
TestStandは書き込むDLLを使用しますが、testStandコードを制御することはできません。私のDLLでは、私はクラスBのメンバーを持っています。タイプBのこのメンバーは、私がそれを担当していないので制御できないDLLから来ます(私たちはDLLBと呼ぶでしょう)。
DLLBの例外が発生したため、TestStandがクラッシュします。 TestStandはtry catch例外処理を持たず、Bメンバーを介してDLLBを使用していると考えられます。 –

関連する問題