私はユニット - > 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)
あなたのコードとNUnitライブラリ/テストランナーはどちらも同じバージョンの.NETランタイムを参照していますか? –
私は彼らがそう思う。新しく作成されたappdomainに触れないすべてのテストはまだうまくいっています。また、現行のappdomainを代わりに使用すると、うまく動作しないテストでもうまく動作します(アンロードはしないでください)。提案に対する多くの感謝。 – user1002059
は、appdomainのやりとりに問題があるように聞こえます。正確に同じ*コードが直接(.exeとして)実行されても動作するが、NUnitで動作するときは機能しないことを示す必要があります。例えば両方のバリエーションがテストケースを実装する唯一のメソッドを呼び出すことによって実現されます。また、私は、製品のサポート要求が最初に製品のメーリングリストに向かうべきだとの意見です。 –