在面向 .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.0
它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
没有满足对[来自PowerPack]的引用。
只需将引用重定向到现有版本的 FSharp.Core.dll,即可以F# PowerPack Target Runtime主题中提到的残酷方式轻松解决该问题。
那么问题是什么?
问题是当我们将安装的程序集引用到 GAC 时,为什么一切正常而没有任何重定向。对于 GAC,它似乎对 FSharp.Core.dll 2.0 本身的存在感到满意,然后将其丢弃,使用 4.0 版本用于所有目的。这背后的逻辑是什么?
Jeffrey Richter通过 C# 的 CLR 似乎对此一无所知...