Тест NUnit умирает с SerializationException, но работает нормально, если не запускается под NUnit - PullRequest
1 голос
/ 26 декабря 2011

У меня есть немного кода 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)

1 Ответ

1 голос
/ 31 декабря 2011

Добрые пользователи сети NUnit-Discuss предложили решение. Вкратце, просто позвольте пути быть местоположением (то есть каталогом) исполняемого файла, затем создайте другой домен как:

AppDomain.CreateDomain («MyTempDomain», null, path, «», false)

...