5

在面向 .NET 4.0 的 F# 应用程序中使用 PowerPack 会带来一些痛苦

FSharp.PowerPack.dll仍然(为什么?他们会放弃它吗?)仅引用FSharp.Core.dll 2.0哪些目标 .NET 2.0。同时FSharp.Core.dll 4.0不兼容.NET 2.0。

当两者都在 GAC时FSharp.Core.dll 2.0,情况如何?4.04.0在与当前的 .NET 框架兼容时加载,然后告诉FSharp.PowerPack.dll所有内容都已加载。这可以在 Visual Studio 调试器中看到,当应用程序加载时,在 Reflector 中遍历依赖项时。

一切都很好,直到我们需要以可移植的方式重新分发软件。当我们真正需要时,我们将复制FSharp.Core.dll 4.0(与 .NET 4.0 一致)并复制FSharp.PowerPack.dll到应用程序本地代码库。然后它(突然!)抱怨FSharp.Core.dll 2.0没有满足对[来自PowerPack]的引用。

只需将引用重定向到现有版本的 FSharp.Core.dll,即可以F# PowerPack Target Runtime主题中提到的残酷方式轻松解决该问题。

那么问题是什么?

问题是当我们将安装的程序集引用到 GAC 时,为什么一切正常而没有任何重定向。对于 GAC,它似乎对 FSharp.Core.dll 2.0 本身的存在感到满意,然后将其丢弃,使用 4.0 版本用于所有目的。这背后的逻辑是什么?

Jeffrey Richter通过 C# 的 CLR 似乎对此一无所知...

4

1 回答 1

5

首先,您需要知道 CLR 4.0 引入了与 CLR 2.0 不同的 GAC。CLR 4.0 的 GAC 看到旧版本,但反之则不然。

现在,在 CLR 4.0 GAC 中有一个重定向 - FSharp.Core 的发布者策略文件,它将任何请求重定向到加载版本 2.0 到 4.0。这包含与您链接到的配置文件基本相同的内容。

在 CLR 2.0 GAC 中没有这样的重定向,显然是因为 4.0 不在该 GAC 中并且无论如何都不兼容。

要亲自查看,请在加载 FSharp.Core 时使用融合日志查看器 (fuslogvw) - 它应该显示正在发生的重定向。

还请查看我的 CLR 4.0 GAC 中的 pub.config 文件位于 C:\Windows\Microsoft.NET\assembly\GAC_MSIL\policy.2.0.FSharp.Core\v4.0_2.0.0.0__b03f5f7f11d50a3a

于 2012-05-17T02:34:33.050 回答