为 CSharpCompilation.Emit 指定框架版本

Specify Framework Version for CSharpCompilation.Emit

有谁知道在使用 CSharpCompilation 的扩展方法 Emit 发出程序集时是否可以指定框架版本?

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

MissingMethodException
Method not found: '!!0[] System.Array.Empty()'.

或者我们是否必须等到客户端升级到 Framework 4.6 才能使用 Roslyn?

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

相反,您需要确保安装了 4.5.1 目标包(VS 安装会自动执行此操作,但其他机器可能没有),并从 C:\Program Files (x86)\Reference Assemblies.

如果引用的程序集中存在 Array.Empty,编译器将发出对 Array.Empty 的引用,但如果不存在,则具有回退逻辑。