【问题标题】:How to get the version of the .NET Framework being targeted? [duplicate]如何获取目标 .NET Framework 的版本? [复制]
【发布时间】:2013-10-06 11:18:17
【问题描述】:

如何获取我所针对的 .NET Framework 版本,而不是应用当前运行的 .NET Framework 版本?

例如,如果应用程序以 .NET Framework 4.5 为目标,我需要知道我的目标是 .NET Framework 4.5。

例如检查System.Environment.Version:

  • 当面向 .NET Framework 4 时:4.0.30319.18502
  • 当面向 .NET Framework 4.5 时:4.0.30319.18502

所以这行不通。

真正的目标是尝试解决lack of compiler defines in .NET

【问题讨论】:

  • 这个问题真的没有多大意义。如果您的程序是使用 .NET Framework 4.5 编译的,但您从不使用 dynamicasync 或任何其他 .NET Framework 4.5 特定功能,理论上您可以在 .NET Framework 3.5 上运行它而无需修改。但为什么这很重要?您是否尝试使用dynamic 编写程序,但能够将其编译为 使用dynamic 的备用3.5 版本?也许在缩减功能模式下?
  • @MatthewWatson:那是在运行时,而不是编译时。
  • @TimS。那个问题"Detect target framework version at compile time"正是我想要的!不幸的是,没有解决方案(除了要求使用共享代码的人更改他们的解决方案)。

标签: c# .net


【解决方案1】:

这很简单 - 检查TargetFrameworkAttribute

var targetFrameworkAttribute = Assembly.GetExecutingAssembly()
    .GetCustomAttributes(typeof(System.Runtime.Versioning.TargetFrameworkAttribute), false)
    .SingleOrDefault();

【讨论】:

  • 这只在运行时有效,在编译时无效。请参阅 OP 中的最后一句话,他说他正在寻找编译器定义。
  • @RobertHarvey 那又怎样? OP 可以使用简单的 if else 语句来解决这个问题。而且我没有看到任何地方提到它应该是编译时间如果它需要编译时间,那么正如蒂姆建议的那样,条件编译参数会有所帮助
  • 哦,我知道代码现在在做什么了。起初我以为它使用的是 4.5 特定代码。现在我意识到它实际上是在询问程序集它的目标是什么。虽然这不会帮助我以任何对性能至关重要的方式解决我的问题,但它绝对回答了我的问题。 (知道它是 .NET 4.5,我可以使用反射来调用我需要的方法。是的,反射要慢几个数量级,但至少它会起作用)。
  • 嗯,我认为这个类是 .net 4.0 中的新类,所以我认为你不能在 .net 4.0 之前使用它:(
  • 幸运的是,我现在处理的仅有两个项目是 4。一个我可以更新到 4.5。但这意味着我不能按原样签入代码更改;因为有些人的目标是 .NET 2 或 3/3.5
【解决方案2】:

是什么阻止您使用普通的/define

csc /define:NET45 /optimize /out:MyProgram.exe *.cs

using System;
public class Test 
{
    public static void Main() 
    {
        #if (NET45) 
            Console.WriteLine("NET45 targeted");
        #else
            Console.WriteLine("NET45 not targeted");
        #endif
    }
}

【讨论】:

  • 因为我无权访问该项目。这是可以在以 .NET 2、.NET 3、.NET 3.5、.NET 4、.NET 4.5、.NET 1、.NET n+1 为目标的项目中运行的共享代码
  • 这可以通过检查TargetFrameworkVersion轻松修改。
  • @IanBoyd 您可以有条件地包含您的参考资料。
  • @IanBoyd:只要让编译代码的人在 csc 命令行上使用适当的 /define 编译它。
  • @IanBoyd 也许你应该解释一下你当前的用例是什么(我的意思是,谁拥有/编译代码,为什么你需要获取框架版本......等等)因为现在不是那样如果您正在寻找编译时或运行时解决方案,请明确。
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多