TestStandを終了するまで.NETアセンブリがアンロードされない

更新しました Apr 1, 2019

使用製品

Software

  • TestStand

Operating System

  • Windows

Programming Language

  • C# .NET
  • Visual Basic .NET

問題

TestStandから.NETアセンブリを呼び出し、そのオブジェクトリファレンスをFileGlobalに格納しています。アセンブリがメモリからアンロードされると予想されるときに、アセンブリがアンロードされないことがあります。ほとんどの場合、File>>Unload All Modulesを選択してアセンブリを手動でアンロードできますが、場合によってはTestStandを終了することでしかアセンブリをメモリからアンロードすることしかできません。.NETアセンブリがメモリに残るのはなぜですか?

解決策

  1. アセンブリをアンロードするテストのどのポイントでも、FileGlobalオブジェクトリファレンスをNothingに設定します。
    • TestStand 3.1以前
      • 各実行を完了して実行ウィンドウを閉じる前に、FileGlobal変数をNothingに設定します。そうしないと、次のガベージコレクションが発生するまで解放されません。
      • ガベージコレクションを明示的にトリガするには、コードモジュールでGC.Collectを呼び出します。
    • TestStand 3.5以降
      • 定期的なガベージコレクションの頻度は、Engine.DotNetGarbageCollectionIntervalプロパティを変更することで設定できます。
      • 詳細については、DotNetGarbageCollectionInterval Propertyプロパティを参照してください。

         
  2. .NETアセンブリを呼び出すすべての手順をアンロードします。
    • 該当する各ステップ:
      1. Step Settings>>Properties>>Run Optionsに移動します。
      2. アセンブリをアンロードしたい場所でLoad Optionがロードされるように設定されていないことを確認します。
        • 動的にロードすると、ステップが最小時間ロードされますが、テスト時間が遅くなる可能性があります。
        • 詳細については、Properties Tabを参照してください。
      3. アセンブリをアンロードしたい場所でLoad Optionがロードされるように設定されていないことを確認します。
        • ステップ実行後にアンロードすると、ステップが最小時間ロードされますが、テスト時間が遅くなる可能性があります。
        • 詳細については、Properties Tabを参照してください。
    • File >> Unload All ModulesよりTestStandのすべてのモジュールを手動でアンロードすることもできます

追加情報

TestStandは、.NETアセンブリを呼び出す全ステップをTestStandがアンロードし、アセンブリから作成されたすべてのオブジェクトを解放するまで、.NETアセンブリをメモリからアンロードできません。シーケンスの実行中、TestStandはFileGlobalsの実行時コピーを維持し、このコピーはExecutionオブジェクトによってリファレンスされます。完了したExecutionオブジェクトは、FileGlobalsへのリファレンスを解放しません。再起動しても実行にはまだ必要である可能性があるためです。Executionオブジェクトが破棄されると(通常はExecutionウィンドウが閉じると)、ExecutionオブジェクトはFileGlobalsへのリファレンスを解放します。
 

.NETオブジェクトリファレンスをFileGlobal変数に格納すると、変数がNothingに設定されるまで(詳細については、Special Constant Valuesを参照)、またはTestStandが親FileGlobalsコンテナへのリファレンスをすべて解放するまで、TestStandはオブジェクトへのリファレンスを解放しません。したがって、リファレンスを保持する変数をNothingに設定しないと、.NETはオブジェクトを破棄できず、実行ウィンドウを閉じるまでTestStandはアセンブリをメモリからアンロードできません。 TestStandは、ステップおよびシーケンスファイルのアンロードオプションおよびすべてのすべてのモジュールアンロード操作を効果的に無視します。
 

たとえば、TestStand 3.1では、FileGlobal変数に.NETオブジェクトリファレンスを格納し、FileGlobalsを参照するSequenceContextオブジェクトを.NETオブジェクトのメソッドに渡すと、.NETはそのメソッドから戻った後にそのリファレンスを解放します。そして、パラメータリファレンスをガベージコレクションに入れます。UnstroyedパラメータはFileGlobalsへのリファレンスを維持するので、FileGlobalsは次のガベージコレクションが発生するまで解放されません。唯一の回避策は、FileGlobal変数を明示的にNothingに設定するか、実行を完了して実行ウィンドウを閉じる前にコードモジュールでGC.Collectを呼び出すことです。
 

TestStand 3.5以降では、.NETアダプタは定期的に.NETに解放されたオブジェクトをガベージコレクションして破棄を確定し、メモリから削除するように要求します。この間隔はデフォルトの3秒に設定されていますが、Engine.DotNetGarbageCollectionIntervalプロパティを変更することで手動で設定できます。

この記事はお役に立ちましたか?

いいえ