Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何询问运行时编译的目标是哪个.NET框架?_C#_.net - Fatal编程技术网

C# 如何询问运行时编译的目标是哪个.NET框架?

C# 如何询问运行时编译的目标是哪个.NET框架?,c#,.net,C#,.net,在运行时是否可以发现我自己的编译器针对的是哪个.NET Framework版本? 我正在编写的环境允许我编写在另一台机器上编译的C#,但除了2.0 CLR之外,我不知道哪种语言版本可用。我想编写一个测试,输出到日志文件中,指示目标框架 为了让它工作,我想编译的程序集必须携带这些信息 这个问题不是如何列出运行时机器上的所有框架,因为当前的所有版本都已安装。这不是那个问题的重复。这也不是如何使用System.Environment.Version确定CLR的重复。我也不尝试在编译时检测目标.NET运

在运行时是否可以发现我自己的编译器针对的是哪个.NET Framework版本? 我正在编写的环境允许我编写在另一台机器上编译的C#,但除了2.0 CLR之外,我不知道哪种语言版本可用。我想编写一个测试,输出到日志文件中,指示目标框架

为了让它工作,我想编译的程序集必须携带这些信息


这个问题不是如何列出运行时机器上的所有框架,因为当前的所有版本都已安装。这不是那个问题的重复。这也不是如何使用System.Environment.Version确定CLR的重复。我也不尝试在编译时检测目标.NET运行时。这需要是一个运行时检测,以便我可以将其发送到日志。

反编译器有时会告诉您这一点。例如,Telerik的free justdecompile显示了这一点,但并非所有程序集都显示了这一点

这里放大了一点


此信息存储在程序集中,因为运行EXE文件是必需的。我阅读了具有此功能的目标框架:

    public string GetTargetFramework()
    {
        System.Reflection.Assembly assembly;
        Attribute[] attributes;
        System.Runtime.Versioning.TargetFrameworkAttribute targetFrameworkAttribute;

        assembly = Assembly.GetEntryAssembly();
        attributes = AssemblyDescriptionAttribute.GetCustomAttributes(assembly);
        foreach(Attribute item in attributes)
        {
            targetFrameworkAttribute = item as System.Runtime.Versioning.TargetFrameworkAttribute;
            if(targetFrameworkAttribute != null)
                return targetFrameworkAttribute.FrameworkDisplayName;
        }
        return null; // "TargetFrameworkAttribute not found"
    }

我特意解释了名称空间。

看这里——似乎问题很难解决。通过@acrivwerx查看上面的内容,它很有用。不过,还有一些附加信息-您可以使用Assembly.GetReferencedAssemblys查看应用程序引用的DLL(版本)。问题是,针对2.0以上版本的应用程序不能保证只使用2.0 DLL,因为4.0之前的.NET Framework只是在现有的2.0 DLL上添加了额外的DLL。我有点困惑,你的意思是想在运行时查明代码是编译为clr的v2.0还是v4.0目标?@activwerx,很好的链接,但几乎涵盖了所有的主题,除了需要什么。他唯一一次走近的时候,只是问为什么有人需要这么做。嗯,我需要这样做。@dtryon是的,我想知道编译选项上的目标框架,但通过在运行时从编译代码中读取,因此程序集需要在其清单中携带该框架并读取值。这与反编译器无关,该属性特定于最近的编译器。它不会出现在3.5SP1及更早版本附带的编译器中,也不确定是4.0还是4.5