如何将 C# 6 与网站项目类型一起使用?

Posted

技术标签:

【中文标题】如何将 C# 6 与网站项目类型一起使用?【英文标题】:How to use C# 6 with Web Site project type? 【发布时间】:2015-07-21 20:10:17 【问题描述】:

更新了一个现有的网站项目类型 Visual Studio 2015,我将框架更改为 4.6。

然后我希望在我的代码隐藏文件中提供所有这些新功能。

不幸的是,我遇到了如下错误:

错误 CS8026:功能“表达式主体属性”在 C# 5 中不可用。请使用语言版本 6 或更高版本。

或例如:

错误 CS8026:功能“插值字符串”在 C# 5 中不可用。请使用语言版本 6 或更高版本。

我做了一个快速的谷歌检查,在 ScottGu 的博客文章中找到了a guy posting some comments(在页面上搜索“8026”)。

由于我不理解他的解决方案,加上我想让解决方案更明显,我创建了这个 SO 帖子。

我的问题:

我怎样才能拥有一个类型为 Web 站点(即不是 Web 应用程序)的 Visual Studio 2015 项目来识别 C# 6 功能?

【问题讨论】:

你有没有尝试添加他在评论中提到的配置元素? 我正要这样做,但它看起来真的很奇怪对我,所以我期待一些更干净的解决方案。 当然,另一种选择是停止使用那些网站“项目”,而使用 Web 应用程序项目。 @JohnSaunders 我会喜欢这样做。由于迁移是一项手动任务,我担心它会花费时间以及我将在迁移过程中引入的所有错误。为较小的项目做了几次。总是很麻烦... 很高兴您考虑过。该评论主要针对可能认为“网站”项目听起来像他们想要的其他读者。 【参考方案1】:

我已经使用 ASP.NET MVC 5(测试 5.2.3)对此进行了测试,您的里程可能会因其他 Web 框架而异,但您只需为 Roslyn CodeDOM 添加 NuGet 包。

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 应该添加 DLL 文件...

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

使用新的 .NET 编译器平台(“Roslyn”)编译器作为服务 API 的替代 CodeDOM 提供程序。这为使用 CodeDOM 的系统中的新语言功能(例如 ASP.NET 运行时编译)提供了支持,并提高了这些系统的编译性能。

...并将以下内容添加到您的 web.config:

<system.codedom>
  <compilers>
    <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
    <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
  </compilers>
</system.codedom>

如果 XML 仍然丢失,请尝试自己添加。

【讨论】:

这按预期工作。 C# 6 现在可用。缺点是我的 App_GlobalResources/Resources.resx 不再生成用于强类型访问资源的自动类。 请注意,在项目目标更改为 4.6 后,我能够毫无错误地构建。但是,我需要安装这个包来解决智能感知中出现的红色波浪线。 我在 WebForms 网站中使用它(没有项目文件)。可悲的是,在浏览器中重新请求页面时,简单的 .aspx 更改会导致重新编译速度非常慢。也许 Roslyn 理论上对于 WebApplication(带有 proj 文件)更快,但对于网站来说,通过 App_Code 文件夹中的 csc 似乎要慢得多......有人看到同样的东西吗? 注意,要使用 C#6 编译 WebForms,您需要安装 NuGet 包 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 及其依赖项 Microsoft.Net.Compilers 请注意,如果您的解决方案中有多个网站 - 事情将无法正常工作,最简单的重现方法是创建空解决方案并在第二个网站之后开始向其中添加项目 - 您将开始收到“找不到 csc.exe”错误【参考方案2】:

另请参阅Sayed Ibrahim Hashimi 中的this blog post,了解如何通过 VS IDE 执行此操作。

在 Visual Studio 2015 Update 1 中,我们添加了一项新功能来简化此操作。如果您打开了一个解决方案,其中至少有一个针对 .NET 4.5+ 的 Web 项目并且在“项目”菜单中没有 DotNetCompilerPlatform NuGet 包,您将看到一个新选项,即启用 C# 6 / VB 14。

更新。

VS 2017 和 2019 将此功能移至 Build -> ASP.NET Compilation

【讨论】:

我在 VS2019 中打开了一个旧的基于文件夹的网站项目,并且必须在该选项出现之前文件 > 保存项目。 网站模板中不可用【参考方案3】:

我按照@jbtule 的建议安装了 DotNetCompilerPlatform,但仍然遇到相同的错误。

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

我关闭了解决方案,删除了 bin 和 obj 文件夹,然后打开了解决方案并重新构建。现在 C# 6 功能可以工作了。

【讨论】:

【参考方案4】:

可能的解决方案,取自the comments on ScottGu's blog posting(在页面搜索“8026”):

解决方案建议 1(大卫·泰勒)

将这些 RTM 代码 dom 元素添加到 web.config:

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
        <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
</system.codedom>

然后将 Roslyn 和 Microsoft.CodeDom.Providers.*.dll 内容添加到您的 BIN 目录中。

设置起来很容易,但如果您在 VS 2015 RTM 中创建新的“网站”时选择了 .NET 4.6,则没有为它设置默认模板对我来说很奇怪。

解决方案建议 2(马丁)

根据上面 David Taylor 的评论,当使用 TargetFramework 作为默认 v4.5.2 创建 Web 应用程序时,system.codedom 设置似乎是正确的。将 TargetFramework 更改为 v4.6 似乎会修改 CSharp 的编译器设置,从而导致问题。

我的解决方法如下:

    文件/新建/ASP.NET Web 应用程序 从 ASP.NET 4.5.2 模板中选择“Web API”模板 在 web.config 中复制 system.codedom 元素(及其内容) 使用 Properties/TargetFramework,将 Target Framework 设置为 4.6 将 web.config 中修改后的 system.codedom 元素替换为更改 TargetFramework 之前的副本 按 F5

主页应该按预期加载。

有关信息,将 TargetFramework 更改为 v4.6 后立即显示的 system.codedom 内容。如下(注意使用“Microsoft.CSharp.CSharpCodeProvider”类型):

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701">
            <providerOption name="CompilerVersion" value="v4.0"/>
        </compiler>
        <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
</system.codedom>

【讨论】:

关于您的解决方案 2,Microsoft.CSharp.CSharpCodeProvider 4.0 版意味着它没有使用 Rosyln,因此不适用于 C# 6.0。 从旧解决方案迁移时,确保csproj 文件中的&lt;LangVersion&gt; 等于6。如果是其他原因,可能会导致问题。【参考方案5】:

这不适用于网站项目。这就是您为 ASP.NET MVC 项目执行此操作的方式。

您可以在 Visual Studio UI 中切换 C# 6。这是一个如此简单的选择,值得一试。

    右键单击您的项目并选择属性。 点击构建标签。 构建选项卡的底部有一个高级...按钮。 这会打开高级构建设置,如下所示。选择 C# 6.0。

【讨论】:

@Manuzor 你可能是对的。这是针对 ASP.NET MVC 项目的。 @Ucho 怎么了?它是一个 MVC 项目吗?您在构建设置中有高级选项吗?您是否缺少 C# 语言版本的选项?是否设置了版本无法使用语言功能? @Jess:啊,可能正在工作。我没有注意到我的错误来自 IntelliSense 而不是构建。 此设置似乎不适用于 aspx 页面中的代码,例如&lt;% Eval(whatever) %&gt;. 不适用于我的 MVC 项目。下拉菜单被禁用,下面的超链接显示我无法更改版本。【参考方案6】:

这是在 VS2017 中使用网站项目时的样子:

【讨论】:

我很欣赏 @Uwe 的裁剪工作,但我认为我不同意删除顶部导航的其余部分,因为这个特定菜单项应该在哪里的上下文丢失了。 最新的 VS 2017 已将其移至“构建 -> ASP.NET 编译”。请参阅我的更新答案。 对于网站项目类型,我测试了@b_levitt 在 VS2019 上的回答。 (1) 确保您有一个 web.config。如果不加一个。 (2) 通过在解决方案资源管理器中选择解决方案并按下 [Ctrl] + [S] 来保存解决方案。 (3) 在解决方案资源管理器中选择项目并将目标框架更改为 4.7.2 (4) 从菜单 Build > ASP.NET Compilation 中选择“Enable latest C#...”选项。 "路径不合法"【参考方案7】:

我在对我的 WebAPI 项目进行零更改后收到此错误。我卸载了 DotNetCompilerPlatform nuget 包并重新安装,这解决了问题。

【讨论】:

以上是关于如何将 C# 6 与网站项目类型一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C# 8.0 可空引用类型与 Entity Framework Core 模型一起使用?

C#,MVC3,如何将非泛型 DBSet 与运行时定义的类型一起使用?

如何将 Travis-CI 与 C# 或 F# 一起使用

如何在 Visual Studio 2017 中使用 C# 8?

如何在 Visual Studio 2017 中使用 C# 8?

为 ASP.NET 网站编写可重用的 c# 代码