【发布时间】: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。 announcement 说 It 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