Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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语言的跨版本兼容性?_C#_.net - Fatal编程技术网

C# 什么规则管理.NET应用程序和C语言的跨版本兼容性?

C# 什么规则管理.NET应用程序和C语言的跨版本兼容性?,c#,.net,C#,.net,出于某种原因,我总是很难记住框架所做的向后/向前兼容性保证,所以我想永远忘记这一点 假设我有两个程序集,A和BA较旧,并且引用.NET 2.0程序集B引用.NET 3.5程序集。我分别拥有A和B、Ax和Bx的源代码;它们是在2.0和3.0语言级别用C#编写的。(也就是说,Ax不使用在C#2.0之后引入的功能;同样地,Bx也不使用在3.0之后引入的功能。) 我有两个环境,C和DC安装了.NET2.0框架D安装了.NET 3.5 framework 现在,我能/不能做以下哪项 运行: 在C上运行A?

出于某种原因,我总是很难记住框架所做的向后/向前兼容性保证,所以我想永远忘记这一点

假设我有两个程序集,
A
B
<代码>A较旧,并且引用.NET 2.0程序集<代码>B引用.NET 3.5程序集。我分别拥有
A
B
Ax
Bx
的源代码;它们是在2.0和3.0语言级别用C#编写的。(也就是说,
Ax
不使用在C#2.0之后引入的功能;同样地,
Bx
也不使用在3.0之后引入的功能。)

我有两个环境,
C
D
C
安装了.NET2.0框架
D
安装了.NET 3.5 framework

现在,我能/不能做以下哪项

运行:

  • C
    上运行
    A
    ?在
    D
    上运行
    A
  • C
    上运行
    B
    ?在
    D
    上运行
    C
  • 汇编:

  • C
    上编译
    Ax
    ?在
    D
    上编译
    Ax
  • C
    上编译
    Bx
    ?在
    D
    上编译
    Bx
  • 重写:

  • 重写
    Ax
    以使用C#3语言级别的功能,并在
    D
    上编译它,同时使它仍在
    C
    上工作
  • 重写
    Bx
    ,以便在另一个具有.NET 4的环境
    E
    上使用C#4语言级别的功能,同时使其仍能在
    D
    上工作
  • 从另一个程序集引用:

  • A
    中引用
    B
    ,并在
    C
    上使用客户端应用程序
  • A
    中引用
    B
    ,并在
    D
    上使用客户端应用程序
  • B
    中引用
    A
    ,并在
    C
    上使用客户端应用程序
  • B
    中引用
    A
    ,并在
    D
    上使用客户端应用程序
  • 更重要的是,这些假设情景的真实性或虚假性由哪些规则决定

    在C上运行A?在D上运行A

    没问题

    在C上运行B?在D上运行C

    您不能在
    C
    上运行
    B
    ,因为它引用了
    C
    上不可用的3.5个程序集。在
    D
    上运行
    C
    没有问题

    在C上编译Ax?在D上编译Ax

    没问题

    在C上编译Bx?在D上编译Bx

    您无法在
    C
    上编译
    Bx
    ,因为它没有安装引用的3.5程序集。在
    D
    上编译
    Bx
    没有问题

    重写Ax以使用C语言中的功能# 3语言级,并在D上编译, 当它还在C上工作时

    是的,这是可能的

    重写Bx以使用C语言中的功能# 4另一个语言级别 具有.NET4的环境E,而 让它仍然在D上工作

    否这是不可能的,因为如果以CLR 4.0为目标,程序集将无法在以前的CLR版本上运行

    作为结论:


    ildasm.exe yoursassembly.dll
    。双击
    清单
    ,查看
    元数据版本
    。如果是
    v2.0.50727
    ,则表示此程序集已针对CLR 2版本编译。然后查看引用的程序集。如果在引用中看到一个名为
    System.***
    且版本为3.5.0.0的引用程序集,则表示需要.NET 3.5 framework。如果没有,它可能只在安装了.NET 2.0的情况下运行良好(当然,它不应该引用任何其他依赖于.NET 3.5的程序集)。

    必须了解更多信息才能了解这个问题!我的理解是,通过安装.NET3.5,您还可以安装2.0程序集(也就是说,它是一个超集)。不是这样吗?还有,为什么我可以重写
    Bx
    ,但不能重写
    Ax
    ?CLR 4有什么特别的地方会破坏它吗?是的,当然,这就是为什么你可以在
    D
    环境中使用
    A
    B
    做任何你想做的事情。Net 3.5(应该?)安装2.0程序集,因为它们都使用相同版本的CLR。您可以随意重写
    Ax
    Bx
    ——如果您重写它们以使用C#3.0功能,您将无法在.Net 2.0环境中运行它们;如果重写它们以使用C#4.0功能,则需要在安装了.Net 4.0的环境中运行它们。@Graham:C#3.0不需要.Net 3.5。您可以在.NET2.0程序中使用C#3.0功能。