gpt4 book ai didi

.net - 在同一应用程序中解析对同一 .NET 程序集不同版本的编译时引用

转载 作者:行者123 更新时间:2023-12-05 01:01:42 24 4
gpt4 key购买 nike

在面向 .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.04.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 Target Runtime 主题中提到的残酷方式轻松解决该问题。

那么问题是什么?

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

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

最佳答案

首先,您需要知道 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

关于.net - 在同一应用程序中解析对同一 .NET 程序集不同版本的编译时引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10563829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com