C# 指定CSharpCompilation.Emit的框架版本

C# 指定CSharpCompilation.Emit的框架版本,c#,roslyn,roslyn-code-analysis,C#,Roslyn,Roslyn Code Analysis,有人知道在使用CSharpCompilation的extensionmethod Emit发出程序集时是否可以指定框架版本吗 显然,我们需要以4.5.1为目标,否则会出现严重的运行时错误: MissingMethodException Method not found: '!!0[] System.Array.Empty()'. 或者我们必须等到客户端升级到Framework4.6之后才能使用Roslyn吗?编译器没有(也从来没有)一个“框架版本”的概念。编译器只知道包含了哪一组引用。听起来您

有人知道在使用CSharpCompilation的extensionmethod Emit发出程序集时是否可以指定框架版本吗

显然,我们需要以4.5.1为目标,否则会出现严重的运行时错误:

MissingMethodException
Method not found: '!!0[] System.Array.Empty()'.
或者我们必须等到客户端升级到Framework4.6之后才能使用Roslyn吗?

编译器没有(也从来没有)一个“框架版本”的概念。编译器只知道包含了哪一组引用。听起来您在创建编译时引用了框架的4.6版本(可能是因为您使用的是正在运行的程序集位置,并且是在4.6上运行的)

相反,您需要确保安装了4.5.1目标包(VS install会自动执行此操作,但其他计算机可能没有),并从
C:\Program Files(x86)\Reference Assembly
中向编译添加其引用


编译器将发出对
数组的引用。如果引用的程序集中存在空的
,但如果没有,则具有回退逻辑。

FWIW:如果您需要说服客户更新,Microsoft将于2016年1月12日放弃对4.5.1的支持:@JoshVarty这确实是一些重要信息。我很高兴你写了这篇文章,我们完全监督了编辑女士的这篇声明。如果这听起来很讽刺,那它是不应该的。@CSharpie,你说的“目标”是什么意思?4.x框架都以4.0运行时为目标。对于4.52、4.6或4.6.1,哪些代码引发该异常而不引发该异常?Array.Empty()被记录为.NET 4.6方法。不,您不能强迫任何人以该版本为目标。将您愿意支持的版本转换为stone,只生成与该版本兼容的代码。请记住,end of support语句只适用于已安装的.NET版本,它与客户端程序员想要使用的目标包无关。我有点希望得到这样的答案,但我自己无法解决。非常感谢。因此,我需要包含来自C:\Program Files(x86)\Reference Assemblys\Microsoft\Framework\.NETFramework\v4.5.1的引用,我之前正在执行typeof(object).Assembly.Location。