.net NUnit测试因SerializationException而失效,但如果不在NUnit下运行,则工作正常

.net NUnit测试因SerializationException而失效,但如果不在NUnit下运行,则工作正常,.net,f#,nunit,.net,F#,Nunit,我有一点f#代码(如下),它接受一个unit->obj并在它自己的appdomain中计算它。其动机是我需要在评估期间释放加载的程序集。代码似乎工作得很好,至少在我尝试过的一些小例子上是这样。但是,当从NUnit测试调用时,它会失败并出现异常。异常和代码如下所示。我将非常感谢您的帮助 Sandbox.Trial_测试: System.Runtime.Serialization.SerializationException:类型不是 已解决成员的沙箱问题+myDelegate@28,沙盒试验, 版

我有一点f#代码(如下),它接受一个unit->obj并在它自己的appdomain中计算它。其动机是我需要在评估期间释放加载的程序集。代码似乎工作得很好,至少在我尝试过的一些小例子上是这样。但是,当从NUnit测试调用时,它会失败并出现异常。异常和代码如下所示。我将非常感谢您的帮助

Sandbox.Trial_测试: System.Runtime.Serialization.SerializationException:类型不是 已解决成员的沙箱问题+myDelegate@28,沙盒试验, 版本=0.0.0.0,区域性=中性,PublicKeyToken=null'

模块沙箱
开放系统
类型隔离转轮(f:单元->对象)=
继承System.MarshalByRefObject()
让可变存储结果:obj option=None
成员x.callback():单位=
设res=f()
storedResult失败,但“还没有结果”
|一些x->x
让我们在自己的appdomain中运行代码(f:unit->obj):obj=
让appDomain=appDomain.CreateDomain“MyTempDomain”
尝试
设ir=隔离流道f
让myDelegate=new CrossAppDomainDelegate(fun()->ir.callback())
appDomain.DoCallBack myDelegate
红外光谱结果
最后
AppDomain。卸载AppDomain
打开NUnit.Framework
[]
让平凡_测试()=
让实际值=在自己的appdomain中运行代码(乐趣x->123 |>框)|>取消绑定
printf“结果为%O\n”实际值
Assert.AreEqual(123,实际值)

NUnit讨论的网民们提出了一个解决方案。简单地说,让path作为可执行文件的位置(即目录),然后创建另一个域,如下所示:

AppDomain.CreateDomain(“MyTempDomain”,null,路径,”,false)


NUnit的网民们提出了一个解决方案。简单地说,让path作为可执行文件的位置(即目录),然后创建另一个域,如下所示:

AppDomain.CreateDomain(“MyTempDomain”,null,路径,”,false)


您的代码和NUnit库/测试运行程序都引用了相同版本的.NET运行时吗?我想是的。所有不涉及新制作的appdomain的测试仍然可以通过。此外,如果使用当前appdomain(并且不进行卸载),即使失败的测试也可以正常工作。非常感谢您的建议。这听起来很像appdomain交互中存在问题。您需要显示完全相同的代码在直接运行(作为.exe)时有效,但在NUnit下运行时无效。e、 g.通过两个变量调用一个且仅一个实现测试用例的方法。另外,我认为对产品的支持请求应该首先转到产品的邮件列表。您的代码和NUnit库/测试运行程序是否都引用了相同版本的.NET运行时?我认为它们都引用了。所有不涉及新制作的appdomain的测试仍然可以通过。此外,如果使用当前appdomain(并且不进行卸载),即使失败的测试也可以正常工作。非常感谢您的建议。这听起来很像appdomain交互中存在问题。您需要显示完全相同的代码在直接运行(作为.exe)时有效,但在NUnit下运行时无效。e、 g.通过两个变量调用一个且仅一个实现测试用例的方法。另外,我认为产品的支持请求应该首先进入产品的邮件列表。
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)