5

.NET 4.0 をターゲットとする F# アプリケーションで PowerPack を使用すると、問題が発生する

FSharp.PowerPack.dll.NET 2.0 をターゲットとするものだけを参照している. FSharp.Core.dll 2.0同時にFSharp.Core.dll 4.0.NET 2.0 と互換性がありません。

FSharp.Core.dll 2.0との両方4.0が GACにある場合はどうなりますか? 4.0現在の .NET フレームワークと互換性があるためロードFSharp.PowerPack.dllされ、すべてが既にロードされていることが通知されます。これは、アプリケーションが読み込まれるときの Visual Studio デバッガーと、依存関係をウォークスルーするときの Reflector の両方で確認できます。

ポータブルな方法でソフトウェアを再配布する必要があるまでは、すべて問題ありません。実際に必要な場合は、FSharp.Core.dll 4.0(.NET 4.0 でサウンドを鳴らすために)コピーFSharp.PowerPack.dllし、アプリケーションのローカル コードベースにコピーします。そして、(突然!FSharp.Core.dll 2.0 ) [from PowerPack]への参照が満たされていないと文句を言います。

この問題は、既存のバージョンの FSharp.Core.dll への参照をリダイレクトするだけで、 F# PowerPack ターゲット ランタイムのトピックで述べたような残忍な方法で簡単に解決できます。

それで、質問は何ですか?

問題は、GAC にインストールされたアセンブリを参照するときに、リダイレクトなしですべてが問題ない理由です。GAC では、FSharp.Core.dll 2.0 自体の存在に満足しているように見えますが、すべての目的で 4.0 バージョンを使用して、それを破棄します。この背後にあるロジックは何ですか?

C#を介したJeffrey RichterのCLRは、それについて何も言わないようです...

4

1 に答える 1

5

まず、CLR 4.0 では CLR 2.0 とは別の GAC が導入されていることを知っておく必要があります。CLR 4.0 の GAC は古いものを認識しますが、その逆は認識しません。

現在、CLR 4.0 GAC にリダイレクトがあります。これは、バージョン 2.0 をロードする要求を 4.0 にリダイレクトする FSharp.Core のパブリッシャー ポリシー ファイルです。これには、リンク先の構成ファイルと本質的に同じものが含まれています。

CLR 2.0 GAC にはそのようなリダイレクトはありません。これは明らかに、4.0 がその GAC になく、互換性がないためです。

自分で確認するには、FSharp.Core をロードするときにフュージョン ログ ビューアー (fuslogvw) を使用します。リダイレクトが行われていることが示されます。

また、私の CLR 4.0 GAC では C:\Windows\Microsoft.NET\assembly\GAC_MSIL\policy.2.0.FSharp.Core\v4.0_2.0.0.0__b03f5f7f11d50a3a にある pub.config ファイルも見てください。

于 2012-05-17T02:34:33.050 に答える