F# 为什么在初始化带有选项的记录时会收到错误?

F# 为什么在初始化带有选项的记录时会收到错误?,f#,assembly-binding-redirect,F#,Assembly Binding Redirect,为什么在初始化带有选项的记录时会收到错误 以下行未通过我的单元测试: let name = { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None } module CreateModuleViewModel.Tests open FsUnit open NUnit.Framework open UILogic.State open CreateModule.UILogic open ManageModule.

为什么在初始化带有选项的记录时会收到错误

以下行未通过我的单元测试:

let name =      { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }
module CreateModuleViewModel.Tests

open FsUnit
open NUnit.Framework
open UILogic.State
open CreateModule.UILogic
open ManageModule.Entities

[<Test>]
let ``submit module`` () =

    // Setup
    let viewModel = CreationViewModel()

    let name =      { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }

    let duration =  { Hours=1; Minutes=30; Seconds=0 }
    let moduleItem = { Author=name; Duration=duration }

    // Tets
    viewModel.Add(moduleItem)

    // Verify
    viewModel.Modules.Head = moduleItem |> should equal true
type String20 = String20 of string

type Name = { 
    First:String20
    Last:String20
    Suffix:String20 option 
}
测试结果:

let name =      { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }
module CreateModuleViewModel.Tests

open FsUnit
open NUnit.Framework
open UILogic.State
open CreateModule.UILogic
open ManageModule.Entities

[<Test>]
let ``submit module`` () =

    // Setup
    let viewModel = CreationViewModel()

    let name =      { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }

    let duration =  { Hours=1; Minutes=30; Seconds=0 }
    let moduleItem = { Author=name; Duration=duration }

    // Tets
    viewModel.Add(moduleItem)

    // Verify
    viewModel.Modules.Head = moduleItem |> should equal true
type String20 = String20 of string

type Name = { 
    First:String20
    Last:String20
    Suffix:String20 option 
}
结果堆栈跟踪:在CreateModuleViewModel.Tests.submit module()处 结果消息:System.MissingMethodException:未找到方法: 'Void Name..ctor(String20,String20, Microsoft.FSharp.Core.FSharp选项'1')

测试如下:

let name =      { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }
module CreateModuleViewModel.Tests

open FsUnit
open NUnit.Framework
open UILogic.State
open CreateModule.UILogic
open ManageModule.Entities

[<Test>]
let ``submit module`` () =

    // Setup
    let viewModel = CreationViewModel()

    let name =      { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }

    let duration =  { Hours=1; Minutes=30; Seconds=0 }
    let moduleItem = { Author=name; Duration=duration }

    // Tets
    viewModel.Add(moduleItem)

    // Verify
    viewModel.Modules.Head = moduleItem |> should equal true
type String20 = String20 of string

type Name = { 
    First:String20
    Last:String20
    Suffix:String20 option 
}

为什么我会收到此错误?

导致
MissingMethodException
的最常见原因是,您的某些依赖项是根据与单元测试库不同的
FSharp.Core.dll版本编译的

解决此问题的方法是将
bindingRedirect
添加到
app.config
。我认为大多数单元测试运行者也会尊重绑定重定向,因此这应该可以解决问题

马克·希曼。借鉴他的例子,你需要这样的东西:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core"
                          publicKeyToken="b03f5f7f11d50a3a"
                          culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-99.99.99.99"
                         newVersion="4.3.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

新版本将是
4.3.1.0
(Visual Studio 2013)或
4.4.0.0
(Visual Studio 2015)。我将这里的
oldVersion
更改为一个范围,该范围应包括可能存在的所有版本


这导致
MethodMissingException
的原因有点微妙,但没有重定向,从一个F#Core运行的
选项
与从另一个版本的F#Core运行的
选项
不同,因此它无法找到它所期望的方法。

导致
MissingMethodException
的最常见原因是您的某些依赖项是根据不同版本的
FSharp.Core.dll
大于单元测试库

解决此问题的方法是将
bindingRedirect
添加到
app.config
。我认为大多数单元测试运行者也会尊重绑定重定向,因此这应该可以解决问题

马克·希曼。借鉴他的例子,你需要这样的东西:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core"
                          publicKeyToken="b03f5f7f11d50a3a"
                          culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-99.99.99.99"
                         newVersion="4.3.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

新版本将是
4.3.1.0
(Visual Studio 2013)或
4.4.0.0
(Visual Studio 2015)。我将这里的
oldVersion
更改为一个范围,该范围应包括可能存在的所有版本



这导致
MethodMissingException
的原因有点微妙,但没有重定向,一个F#Core的运行时事物,例如
option
,与另一个版本的F#Core的
option
不同,因此它无法找到它所期望的方法。

测试和类型定义在不同的程序集中吗?如果是,您确定在运行时调用了提供类型定义的dll的正确版本吗?我看不出与代码相关的原因使您遇到此错误。某些地方的程序集版本肯定是错误的。谢谢。我的测试项目设置为F#3.1并锁定到该版本,而我的所有其他库都是F#4.0.Scott,从测试项目中删除对FSharp.Core的引用,从packages.config文件中删除FSharp.Core,然后从程序集列表中重新添加正确版本的FSharp.Core,可以在分机下找到。谢谢他们的灯光。我现在正在为我的测试项目与所有这些NuGet依赖性作斗争。我所有的测试都失败了,我仍在努力让我所有的项目都开心。我按照您的指示,在我的属性窗口中观察到我的测试项目的FSharp.Core版本设置为“True”。因此,我的所有其他项目都将版本设置为“4.0”。我现在试图找出FsUnit:找不到与“FsUnit 1.4.1约束:FSharp.Core”兼容的“FSharp.Core”版本(≥ 3.1.2.5).试验和类型定义是否在不同的组件中?如果是,您确定在运行时调用了提供类型定义的dll的正确版本吗?我看不出与代码相关的原因使您遇到此错误。某些地方的程序集版本肯定是错误的。谢谢。我的测试项目设置为F#3.1并锁定到该版本,而我的所有其他库都是F#4.0.Scott,从测试项目中删除对FSharp.Core的引用,从packages.config文件中删除FSharp.Core,然后从程序集列表中重新添加正确版本的FSharp.Core,可以在分机下找到。谢谢他们的灯光。我现在正在为我的测试项目与所有这些NuGet依赖性作斗争。我所有的测试都失败了,我仍在努力让我所有的项目都开心。我按照您的指示,在我的属性窗口中观察到我的测试项目的FSharp.Core版本设置为“True”。因此,我的所有其他项目都将版本设置为“4.0”。我现在试图找出FsUnit:找不到与“FsUnit 1.4.1约束:FSharp.Core”兼容的“FSharp.Core”版本(≥ 3.1.2.5)谢谢Tomas。我的考试现在通过了。但是,我以前通过的所有其他测试现在都失败,并显示相同的错误消息。我正在研究提供的博客,但尚未确定所需的应用程序配置以解决所有dll冲突。有什么建议吗?已将BindingRedirect的新版本属性从newVersion=“4.3.1.0”更新为:newVersion=“4.4.0.0”。我还按照Innerlight的建议,在测试项目上更新了我的FSharp.Core dll,使其指向FSharp4.0。我不确定我是否理解您的配置。其他测试在同一个项目中吗?现在已经解决了。请参考我之前的评论。再次谢谢你,托马斯。我的考试现在通过了。但是,我以前通过的所有其他测试现在都失败,并显示相同的错误消息。我正在研究提供的博客,但尚未确定所需的应用程序配置以解决所有dll冲突。有什么建议吗?更新的新版本属性