C#4.0编译器生成的IL可以在CLR 2.0上运行吗?
为了澄清,我不是在询问VS 2010多目标(VS选择正确的编译器版本),我想知道csc.exe 4.0是否支持多目标...
答案 0 :(得分:7)
如果其他所有方法都失败了,请尝试一下。我刚刚在VS2010b2中测试了以下内容,编译目标2.0:
using System;
class Program {
static void Main() {
Write();
Write(msg: "world");
Console.ReadLine();
}
static void Write(string msg = "Hello") {
Console.WriteLine(msg);
}
}
这使用两个新的C#4.0 语言功能,它们使用.NET 2.x / 3.x / CLR 2中也存在的元数据;它在我的常规(CLR 2)机器上执行正常(我的VS2010b2是一个VM)。所以我总结“是的,对某些功能”。显然,如果你使用一个与框架相关的功能(dynamic
等),它就不会那么好。
编辑:重新评论;我在命令行尝试了csc
,默认情况下, 目标CLR 4;我会试着看看我是否可以把它作为目标CLR 2(就像VS显然可以)。不幸的是,它不再包含构建输出窗口中的(伪造,顺便说一句)命令行......
更新:一些“知情人士”回来了:
传递/ nostdlib以及对2.0 mscorlib.dll的引用。
果然:
C:\Windows\Microsoft.NET\Framework\v4.0.21006>csc /nostdlib /reference:%SystemRo
ot%\microsoft.net\framework\v2.0.50727\mscorlib.dll /out:c:\my.exe /target:exe "
C:\Users\Marc\Documents\Visual Studio 2010\Projects\ConsoleApplication6\ConsoleA
pplication6\program.cs"
Microsoft (R) Visual C# 2010 Compiler version 4.0.21006.1
Copyright (C) Microsoft Corporation. All rights reserved.
工作正常(exe在我的非4.0机器上工作)。图片来源:Kevin Pilch-Bisson
答案 1 :(得分:1)
C#4.0使用.NET CLR 4.0,因此没有与CLR 2.0的二进制兼容性。您将能够以2.0框架为目标。
答案 2 :(得分:1)
这取决于编译器。
到目前为止,指示似乎表明C#4.0编译器将能够以.NET 2.0运行时为目标,生成与该运行时兼容的IL,并确保您只引用也在.NET 2.0上运行的程序集。请注意,定位是一种选择 - 并且无法保证任何其他编译器都具有相同的功能。
大多数情况下,我认为这是由实施编译器的团队做出的决定。
例如,C#和VB.NET编译器团队可能会支持多目标定位(尽管他们可能会退出并将其保留为Visual Studio功能,其中VS为不同的目标选择不同的编译器。)
使用.NET框架的其他供应商可能会做出其他决定。