在SQL Server数据库项目构建期间使用错误的编译器

我有一个使用Visual Studio 2015编译SSDT SQL Server数据库项目的问题。我想在我的数据库项目中使用C#6function,但似乎它不受支持。 例如,我在我的db项目中添加了下一个类:

namespace Database1 { class ClassFile1 { public string Str { get; } = string.Empty; } } 

我试图编译这个,但我得到了错误:

CS1519:类,结构或接口成员声明中的标记’=’无效

我发现这个错误的原因是VS 2015使用的编译器版本错误。下一个编译行由VS生成:

 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702,2008 /nostdlib+ /errorreport:prompt /warn:4 /define:DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva+ /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\mscorlib.dll" /debug+ /debug:full /optimize- /out:obj\Debug\Database2.dll /subsystemversion:6.00 /target:library /warnaserror- /utf8output ClassFile1.cs 

如您所见,使用C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Csc.exe,这是错误的。

我已经尝试从VS 2015开发人员命令提示符编译db项目,这已成功完成,因为在此提示符下csc.exe是Roslyn编译器(C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin \ csc.exe)支持C#6function。 您可以从命令行检查问题如何从而代替csc.exe运行Roslyn?

我尝试使用MSBuild 14.0编译项目,并且也成功完成了。

问题是:如何更改/覆盖我的VS用于编译SSDT DB项目的编译器版本,从旧的C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Csc.exe到新的Roslyn编译器(C: \ Program Files(x86)\ MSBuild \ 14.0 \ Bin \ csc.exe)?

您需要将要部署的SQL版本使用的clr版本作为目标:

SQL 2005-2008 R2 = CLR 2

SQL 2012 = CLR 4

你不能只运行机器上任何版本的clr,我担心。

ED

我也试图这样做并遇到同样的问题。 我的解决方法是创建一个单独的常规类库项目。 我将C#代码从我的数据库项目移动到新库(将使用VS 2015的C#6 / Roslyn编译)。 然后从我的数据库项目中引用此类库。

只需记住设置类库引用的属性: Model Aware = true并Generate Sql Script = true。 我没有彻底测试过,但是我能够使用publish命令从我的Database项目中部署它,并在类库中调用该函数。

好消息!
Visual Studio 2017将使用当前的C#编译器进行SSDT数据库项目,因此具有所有function
C#6最终将在SQL Server程序集中工作。

使用的编译器的路径是:

 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\csc.exe 

因为所有C#6function都只是纯粹的编译器function,所以如果您只针对.NET 3.5和SQL Server 2008,现在甚至可以使用它们。

在Visual Studio 2017 RC中,我还能够使用一些C#7function,如表达式构造函数,新的out变量, ref返回,增强的switch/is模式匹配以及改进的二进制/hex文字。 但我无法使用本地函数或任何与元组相关的函数,如新的元组返回类型,元组文字或新的解构声明。
也许这种行为将在Visual Studio 2017的最终版本中发生变化。