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
任意のヒントが適用されます。