【问题标题】:Reference a .NET 5.0 assembly from a full framework project?从完整的框架项目中引用 .NET 5.0 程序集?
【发布时间】:2021-04-01 01:23:45
【问题描述】:

我们的所有产品(WPF 应用程序)仍在使用 v4.6.1,这有点落伍了。我目前正在“玩” .NET 5,并将我们的一个类库(许多这些产品使用)转换为 v5。我现在正试图从我们的一个较小的产品中引用这个程序集,但它没有构建,有很多错误,例如:

依赖“System.Runtime,版本=5.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”。 1> 无法解析此引用。找不到程序集“System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”

我的印象是 .NET 5 向后兼容,还是仅适用于 .NET Standard? (TBH 我一直在努力理解整个 .NET Standard/Core 的事情)。

我们还不想冒险将产品转换为 .NET 5 - 这是一个长期战略。在我们开始时准备好转换上述类库会很好,那么.NET 框架解决方案有什么方法可以引用 .NET 5 程序集吗?我猜这是不可能的,唯一的选择是多目标?如果是这样,我该怎么做,它会回到 v4.6.1 吗?还是我们坚持将所有内容同时转换为 .NET 5 的“大爆炸”方法?

不确定它是否相关,但在类库的 \bin\debug\ 文件夹中,我可以看到各种子文件夹,例如 net5.0net5.0-windowsnet472netstandard2.1 - 只有 net5.0-windows 包含构建的 DLL .如果这是最低限度,我们也许可以使用 4.7.2,但我不知道如何首先进行多目标。在“目标框架”下拉列表中,我只看到 .NET 5.0、.NET Core 3.0、.NET Core 3.1。

编辑 1

我按照下面卡米洛的建议替换为:

<TargetFrameworks>net5.0-windows;net461</TargetFrameworks>

现在,代码将无法构建。看一个例子,它似乎在抱怨它可以找到 .Net5 但不是 4.6.1 的类型“ItemsControl”:

我假设我需要以某种方式为 v4.6.1 添加 System.Windows.Controls,尽管这充其量是不直观的 - 因为没有在 .Net 框架应用程序中找到的 Add Reference -> Assemblies 窗口.我假设现在必须通过 NuGet 完成,如果需要,我需要哪个包?

【问题讨论】:

    标签: .net wpf .net-standard .net-5


    【解决方案1】:

    .NET Standard 2.0 是最后一个与 .NET Framework 兼容的目标框架。 .NET Standard 2.1 只有 .NET Core 3.0 和更新版本。 .NET 5 与 .NET 5 和更新版本(当它们出现时)兼容。

    请注意 WPF 端口在 .NET Core 3.0 中可用,这就是为什么您不能针对低于它的任何版本。

    让我们看看一些选项:

    1. 类库包含实用程序类、配置和类似的东西,它们独立于框架。

    该库应面向 .NET Standard 2.0:

    <TargetFramework>netstandard2.0</TargetFramework>
    
    1. 类库有一些依赖于框架的引用(如 WPF),并且您想要多目标。

    该库将面向 .NET Framework 4.6.1 和 .NET 5:

    <TargetFrameworks>net461;net5.0</TargetFrameworks>
    

    请注意,您可能需要在许多地方添加 #if 指令,例如(但是,不要在标识符上引用我):

    #if NET461 // something that only exists in .NET Framework 4.6.1
    #elif NET50 // something that only exists in .NET 5.0
    #endif
    

    您可能面临的另一个问题是无法在其中一个目标中找到引用。在这种情况下,您可以有条件地导入引用(您可以查看 Microsoft Docs 文档以查找某个类以找到它所在的库),如下所示:

    <ItemGroup Condition="'$(TargetFramework)' == 'net461'">
        <Reference Include="PresentationCore" />
    </ItemGroup>
    
    1. 类库有一些依赖于框架的引用(如 WPF),但您不希望多目标或到处放置预处理器指令。

    创建第二个项目,仅针对 .NET 5,复制可重用的代码部分,并从头开始无法移动的部分。

    【讨论】:

    • 太棒了!我没有意识到 TFM 允许多个目标。我会试试看。
    • 我在 2) 中尝试过,但现在似乎无法找到 4.6.1“方面”的 WPF 控件 - 请参阅上面的编辑,如果您能抽出一点时间来建议可能会发生什么需要解决这个问题吗? TIA。
    • 这似乎做到了,谢谢。这消除了一些错误,所以我对 PresentationFramework、System.Xaml 等也做了同样的事情,这似乎已经成功了。
    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多