2011-12-25 8 views
1

私はユニット - > objをとり、それ自身のappdomainで評価する少しのf#コード(下記)を持っています。動機付けは、評価中にロードされたアセンブリを解放する必要があるということです。少なくとも私が試した簡単な例では、コードは正常に動作するように見えます。ただし、NUnitテストから呼び出されると例外が発生して失敗します。例外とコードは以下の通りです。私はどんな助けにも大変感謝しています。NUnitテストはSerializationExceptionで終了しますが、NUnitで実行されないとうまく動作します

Sandbox.trivial_test: System.Runtime.Serialization.SerializationException:タイプは 'サンドボックス+ myDelegate 28 @、sandboxtest、 バージョン= 0.0.0.0、カルチャニュートラル、PublicKeyToken = = null' は がメンバーのための解決であります。

module Sandbox 

open System 

type IsolationRunner (f:unit->obj) = 
    inherit System.MarshalByRefObject() 

    let mutable storedResult : obj option = None 

    member x.callback() : unit = 
     let res = f() 
     storedResult <- Some res 

    member x.result : obj = 
     match storedResult with 
     None -> failwith "No result yet" 
     | Some x -> x 

let run_code_in_own_appdomain (f: unit -> obj) : obj =   
     let appDomain = AppDomain.CreateDomain "MyTempDomain" 
     try 
      let ir = IsolationRunner f 
      let myDelegate = new CrossAppDomainDelegate (fun() -> ir.callback()) 
      appDomain.DoCallBack myDelegate 
      ir.result 
     finally 
      AppDomain.Unload appDomain 


open NUnit.Framework 

[<Test>] 
let trivial_test() = 
    let actual = run_code_in_own_appdomain (fun x -> 123 |> box) |> unbox 
    printf "result is %O\n" actual 
    Assert.AreEqual (123, actual) 
+0

あなたのコードとNUnitライブラリ/テストランナーはどちらも同じバージョンの.NETランタイムを参照していますか? –

+0

私は彼らがそう思う。新しく作成されたappdomainに触れないすべてのテストはまだうまくいっています。また、現行のappdomainを代わりに使用すると、うまく動作しないテストでもうまく動作します(アンロードはしないでください)。提案に対する多くの感謝。 – user1002059

+0

は、appdomainのやりとりに問題があるように聞こえます。正確に同じ*コードが直接(.exeとして)実行されても動作するが、NUnitで動作するときは機能しないことを示す必要があります。例えば両方のバリエーションがテストケースを実装する唯一のメソッドを呼び出すことによって実現されます。また、私は、製品のサポート要求が最初に製品のメーリングリストに向かうべきだとの意見です。 –

答えて

1

NUnitの-議論の種類のネチズンは、ソリューションを提案しました。簡単に言うと、ちょうどそのように、他のドメインを作成し、パスが実行可能ファイルの場所(つまりディレクトリ)もみましょう:AppDomain.CreateDomain( "MyTempDomain"、ヌル、パス、 ""、false)を

関連する問題