【问题标题】:How can I compile a .NET 4.5 app with a reference to .NET 4.5.2 assembly?如何编译一个引用 .NET 4.5.2 程序集的 .NET 4.5 应用程序?
【发布时间】:2015-04-05 14:52:58
【问题描述】:

我发现面向 4.5 的应用可以加载和运行面向 4.5.2 的程序集 - 但我无法编译这样的设置!

问题:如何编译引用 .NET 4.5.2 程序集的 .NET 4.5 应用程序?

实验详情:

  • MyLib.csproj - 目标 4.5.2
  • MyApp.csproj - 目标 4.5,有对 MyLib.csproj 的项目引用

在 Visual Studio 或 MSBuild 中编译失败:

警告 MSB3274:无法解析主要引用“(...)\MyLib.dll”,因为它是针对“.NETFramework,Version=v4.5.2”框架构建的。这是比当前目标框架“.NETFramework,Version=v4.5”更高的版本。
错误 CS0246:找不到类型或命名空间名称“MyLib”(您是否缺少 using 指令或程序集引用?)

我尝试单独编译 MyLib 并引用它的 DLL,但得到了相同的编译错误。

但是,我设法让两者都运行:

  • 将两个项目都设置为4.5,编译,复制结果到c:\test\MyApp.exe
  • 将两个项目都设置为4.5.2,编译,将结果复制到c:\test\MyLib.dll
  • 运行 MyApp.exe - 运行正常!

背景:我正在准备将我们的大型 NuGet 托管多项目从 .NET 4.5 过渡到 4.5.2。 announcementIt is a highly compatible, in-place update to the .NET Framework 4, 4.5 and 4.5.1,所以我尝试了如果我们将一些(NuGet 管理的)引用升级到 4.5.2 会发生什么,并且未升级的项目试图使用它们。

【问题讨论】:

  • 为什么不直接把你应用的目标框架改成4.5.2呢?
  • 是的,这是一个高度向后兼容的更新。不转发,他们没有发布包含所有添加类型和成员的 4.5 更新。因此,当您的代码使用不存在的成员时,您的应用程序将在只有 4.5 的机器上启动,然后萎缩、倒塌并死于糟糕的异常。这就是警告告诉你的。您实际上使用此类添加的成员的几率相当低,很少,因此定位到 4.5.2 没有任何意义。
  • @roryap:这个例子当然是人为的。我们的项目很大,有超过 1000 个项目跨越多个解决方案,并且许多生成通过 NuGet 分发到其他解决方案的二进制文件。因此,在升级二进制文件本身之前,我试图避免升级某个二进制文件的所有消费者。
  • 将整个项目升级到 4.5.2。 4.5.2 是 4.0 和 4.5 的二进制替换。它也是最早受支持的 .NET 版本,这意味着目标 4.5 没有意义。除非机器已经安装了 4.5.2 或更高版本,否则 4.5.2 组件甚至无法工作
  • @PanagiotisKanavos :是否可以在具有 4.5.1 的机器上运行针对 4.5.2 的应用程序? (提供的应用程序不使用 4.5.2 特定功能)

标签: .net .net-4.5.2


【解决方案1】:

为了向后兼容,您可以使用多目标。 打开您的 .csproj 文件并像这样进行更改:

 <PropertyGroup>
    <TargetFrameworks>net462;netstandard1.6</TargetFrameworks>
    <PreserveCompilationContext>true</PreserveCompilationContext>
  </PropertyGroup>

这是两个框架的.nuget包示例:net462netstandard1.6

在构建时,它将创建两个包含库的文件夹:

  • net462
  • netstandard1.6

【讨论】:

    【解决方案2】:

    您可以尝试将您的库设为 .NET Standard 库,而不是 .NET Framework 4.X 库。

    请参阅related thread

    【讨论】:

    • 更容易升级项目。甚至不再支持 4.5。最早支持的版本是 4.5.2。此外,要运行 .NET Standard 库,无论如何都必须将运行时升级到受支持的版本
    • @PanagiotisKanavos 当然,但这取决于需要什么。
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多