我正在使用 BenchmarkDotNet 对 F# 代码进行基准测试。如果我从控制台应用程序运行基准测试,一切正常:
[<EntryPoint>]
let main argv =
let summary = BenchmarkRunner.Run<BinomialBenchmark>();
对于一些快速测试,我想从 F# 交互式窗口运行基准测试,在这里我得到以下异常:
System.MissingMethodException: Method not found: 'System.Collections.Immutable.ImmutableArray`1<Byte> System.Reflection.Metadata.MetadataReader.GetBlobContent(System.Reflection.Metadata.BlobHandle)'.
从历史上看,这个构造函数似乎被删除并重新添加到 Collections.Immutable 库中,但我使用的是最新版本(1.3),它应该在其中。请参阅:ImmutableArray 在哪里?
此外,这在运行控制台应用程序时工作正常。我认为问题可能出在引用库的版本中,因此我在控制台应用程序中查看了所有与 BenchmarkDotNet 相关的引用,并检查我是否在 FSX 中引用了相同的引用:
#r "../packages/BenchmarkDotNet/lib/net45/BenchmarkDotNet.dll"
#r "../packages/BenchmarkDotNet.Core/lib/net45/BenchmarkDotNet.Core.dll"
#r "../packages/BenchmarkDotNet.Toolchains.Roslyn/lib/net45/BenchmarkDotNet.Toolchains.Roslyn.dll"
#r "../packages/BenchmarkDotNet.Diagnostics.Windows/lib/net45/BenchmarkDotNet.Diagnostics.Windows.dll"
#r "../packages/Microsoft.CodeAnalysis.CSharp/lib/net45/Microsoft.CodeAnalysis.CSharp.dll"
#r "../packages/Microsoft.CodeAnalysis.Common/lib/net45/Microsoft.CodeAnalysis.dll"
#r "../packages/System.Reflection.Metadata/lib/netstandard1.1/System.Reflection.Metadata.dll"
#r "../packages/System.Collections.Immutable/lib/netstandard1.0/System.Collections.Immutable.dll"
#r "../packages/System.Threading.Tasks.Extensions/lib/netstandard1.0/System.Threading.Tasks.Extensions.dll"
我确保在控制台应用程序中使用了确切的版本。似乎 F# 交互式运行时使用的一些库与控制台应用程序曾经使用的一些库不一样。
LinqPad 似乎也出现了类似的问题: https ://github.com/dotnet/BenchmarkDotNet/issues/66
任何提示都会被应用。