У меня есть немного кода f # (ниже), который берет unit-> obj и оценивает его в своем собственном домене приложения. Мотивация заключается в том, что мне нужно освободить сборки, загруженные во время оценки. Код работает нормально, по крайней мере на тривиальных примерах, которые я пробовал. Однако происходит сбой с исключением при вызове из теста NUnit. Исключение и код приведены ниже. Я буду очень благодарен за любую помощь.
Sandbox.trivial_test:
System.Runtime.Serialization.SerializationException: тип не является
разрешено для участника "Песочница + myDelegate @ 28, песочница,
Версия = 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)