C# 4.0编译器生成的IL可以在CLR2.0上运行吗?
为了澄清,我不是问VS2010多目标( VS选择正确的编译器版本),我想知道csc.exe 4.0是否支持多目标...
发布于 2009-10-23 12:17:47
如果其他方法都失败了,试一试。我刚刚在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);
}
}它使用了两个新的CLR4.0语言特性,它们使用了.NET 2.x/3.x/clr2中也存在的元数据;它在我的常规(Clr2)机器(我的VS2010b2是一个VM)上执行得很好。因此,我的结论是“是的,对于某些特性”。显然,如果你使用依赖于框架的特性(dynamic等),结果就不会那么好了。
编辑:重新编辑您的注释;我在命令行中尝试了csc,默认情况下,这是针对CLR4的;我将尝试是否可以将其转到目标CLR2(就像VS显然可以)。不幸的是,它不再在构建输出窗口中包含(faked,btw)命令行...
更新:一些“知情”的人回来时说:
传递/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
发布于 2009-10-23 09:07:43
C# 4.0使用.NET CLR4.0,因此与CLR2.0没有二进制兼容性。不过,您将能够以2.0框架为目标。
发布于 2009-10-23 09:35:08
这取决于编译器。
到目前为止的迹象似乎表明,C# 4.0编译器将能够面向.NET 2.0运行时,生成与该运行时兼容的IL,并确保您只引用也在.NET 2.0上运行的程序集。
请注意,目标是一种选择,但不能保证任何其他编译器都会具有相同的功能。
大多数情况下,我猜这是一个由实现编译器的团队做出的决定。
例如,C#和VB.NET编译器团队可能会支持多目标(尽管他们可能会放弃这一点,并将其保留为Visual Studio的一个功能,其中VS为不同的目标选择不同的编译器)。
其他使用.NET框架的供应商可能会做出其他决定。
https://stackoverflow.com/questions/1610896
复制相似问题