什么/为什么在 Asp.Net 的 /bin 文件夹中“需要”Roslyn

Posted

技术标签:

【中文标题】什么/为什么在 Asp.Net 的 /bin 文件夹中“需要”Roslyn【英文标题】:What / why is Roslyn "needed" in /bin folder of Asp.Net 【发布时间】:2016-02-17 19:57:15 【问题描述】:

对此有一堆related questions,尽管大多数答案定义 Roslyn 和/或为某些问题提供“修复”(exe,与托管服务提供商等) )

我似乎无法找到/bin/roslyn 中的“为什么”和“为什么”(可能仅在 ASP.Net MVC/Web API 的上下文中)。

我遇到了类似的问题(托管 - .exe 限制,对 4.6 的支持等),我的“修复”是 “只需部署到 Azure”(当然是所有工作顺利)。但实际上,这并没有回答:

为什么需要它们? 这是否意味着它们被用于runtime 编译(我的大脑指向这一点,但这是一个完全的猜测/我可能是错误的 grok),如this SO post shows - 除非更正,这是“它”(更多内容见下文)。 似乎“删除包”是一个“修复”(based on some past answers),但如果是这样,它(重新)提出问题

我认为理解这会有所帮助 - 例如我不可能是唯一一个看到.exe“需要”的人会挑眉的人......


更新

表明存在“隐藏的宝石” :) 我有 read this over and over...毕竟它已经存在了一段时间 - 不是 cmets 线程 - 最初引用的链接,大约在 2014 年,已由 Microsoft 重新设计,不再显示 cmets……幸运的是,相关部分如下。

大错特错 - 它一直盯着我看(或者至少从这次交流开始):

Dmitry Dzygin 2015 年 6 月 2 日上午 12:53

我已经尝试过最新版本的 NuGet 包,但编译器的加载/执行方式似乎有所不同。

在 v0.2.0.0 中,Roslyn 编译器将被加载到内存中,大大提高了未预编译网站的性能 多个 *.as*x/*.cshtml 文件。但是,新版本具有 新的/bin/roslyn/csc.exe 文件,每个文件执行一次, 完全去掉上面提到的优化功能.....

黄金:

XMao 2015 年 6 月 2 日下午 1:22

@Dmitry csc.exe/bin/Roslyn 中的工作是调用位于同一文件夹中的VBCSCompiler.exeVBCSCompiler.exe 是进行实际编译工作的过程。如果 VBCSCompiler 已经在运行 csc.exe 将重用它,因此我们将 仍然获得上述性能改进。

第...


更新:2017 年 10 月

似乎这在所有这些时间之后是相关的,所以进一步更新。

answer below by @Donny V 是一个选项。通过完全编译您的应用程序,包括所有Views (.cshtml/.vbhtml),您的应用程序中将不需要exe

即使 Visual Studio(至今仍是 VS 2017,令人困惑)仍然会在 Publish 进程中创建 /bin/roslyn 及其内容,也是如此,即使“完全编译”已设置

您可以通过排除 /bin/roslyn 文件夹及其内容来测试这一点,然后将您的应用程序推送到您的托管服务提供商。

警告

如前所述,完全编译您的应用程序意味着您必须重新编译它,即使View 级别更改也是如此。

【问题讨论】:

你在使用实体框架吗? @JeroenVannevel - 目前还没有具体,但是这些位已经准备好了...... 那么添加EF作为对项目的引用?直到最近的 PR EF 都依赖于 Roslyn。 @JeroenVannevel 是的,但如果没有记错的话,它来自默认脚手架(除非我对“最新”EF 进行了 Nuget 更新)。我仍然不明白它与 deployment 中“需要”可执行文件 (.exe) 的关系 - 可能只是库/dll,但需要由exe 中的exe 执行部署环境 ? @PederRice 这可能会被 SO 中的任何 MS 人员更正。如果您遇到托管问题(限制exe)您could remove these packages in your project,但是如果您这样做,您需要调试您的代码 - 如果您使用一些新功能或具有 Roslyn 依赖项的功能,事情会破裂。不幸的是,一个“安全”的方法是恢复到4.5.x - 如果项目计划用于 Azure 部署,这是我的个人“修复”。 【参考方案1】:

本文摘自 MSDN 论坛。https://social.msdn.microsoft.com/Forums/vstudio/en-US/442b100a-2b88-4ac4-b655-0c1345791f15/roslyn-cscexe-web-api-2-on-hosting-server?forum=msbuild

我注意到卸载此软件包的一个小缺点:

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform

一些新的 C# 6.0 语言特性(如果在视图中使用)(MVC 项目)将无法编译。我的许多观点都使用 ?。空值 检查运算符以访问模型属性。所有这些观点 现在在我的 Godaddy 托管的 MVC 5 应用程序上返回错误。

出现此错误是因为视图(默认情况下)是在运行时编译的 使用 .NET 管道(未预编译)。

要解决此问题,只需取消选中“允许预编译站点 可更新”选项在您的发布配置文件设置中。这应该 预编译您的视图并允许您的 C# 6.0(Roslyn 的最新版本 编译器)像冠军一样运行。

只是想让看到这个问题的人知道卸载它的后果以及为什么它首先存在

【讨论】:

谢谢。这几乎意味着整个站点都已编译(包括前端vb/cs/html 视图文件,因此它可能不是所有人都可行的情况(必须重新编译整个站点以进行涉及视图的“简单”前端更改)。另外,最后我“发布”了,即使打开了“完全编译”开关,它仍然会在/bin/roslyn 中输出exe 文件..... 只是想让看到这个问题的人知道卸载它的后果以及为什么它首先存在。 如果您使用动态数据形成回发,这将破坏您的网站。【参考方案2】:

在 Visual Studio 2017 社区版中一直遇到此问题,无法重建项目,因为 bin/roslyn 中的旧文件无法删除。根据 OP 的 Gold 评论,我现在保持任务管理器打开 (Ctrl+Shift+Esc) 并终止 VBCS.exe 进程。现在可以删除 bin/roslyn 中的违规文件了。

【讨论】:

【参考方案3】:

它的另一个特点是它不需要构建服务器实际具有编译器依赖项。您将要使用的编译器与代码一起发送到构建服务器,它只是使用您告诉它的内容。

【讨论】:

谢谢,虽然对此感到困惑。 bin/roslyn 中的 exe 是作为“发布”Asp.Net 应用程序的一部分创建的(已经编译/构建)。 Roslyn 组件也通过参考和块状包进入源代码,因此它们可以用于构建,我相信 bin 中的东西可用于任何 JIT'd (Razor) 以及在运行应用程序的系统上从 MSIL 转到本机。【参考方案4】:

此版本的 Visual Studio 包含名为“Roslyn”的新版 C# 和 VB.net 编译器。

Roslyn 完全重写了 C# 和 VB.net 编译器,每个编译器都用各自的语言编写,例如 C# 编译器是用 C# 而不是 C++ 编写的。 Roslyn 是开源的(Roslyn 在 GitHub 上),所以理论上你甚至可以创建自己的 C# 或 VB.net 版本!

后来的 Roslyn 早在 2008 年就被 Anders Hejlsberg 在 PDC 会议上首次提及,但直到 2011 年才发布了第一个预览版。

您可以参考以下链接以获取有关您的问题的更多详细信息。

https://gooroo.io/GoorooTHINK/Article/16253/Visual-Studio-2015-and-Roslyn-Compiler/17944#.VmkfwjaheM8

https://visualstudiomagazine.com/articles/2012/03/20/10-questions-10-answers-on-roslyn.aspx

发件人:https://forums.asp.net/t/2079727.aspx?What+is+the+roslyn+folder+

【讨论】:

谢谢。我认为“什么”很清楚,它是“为什么”,更具体地说,为什么在 Web 应用程序上下文中需要一个可执行文件 (exe),甚至 Web 应用程序已完全编译 - 换句话说,在运行时没有“任何东西”可以编译(一切都已经预编译) - 丢弃/排除整个 roslyn 文件夹就“很好”。【参考方案5】:

有两点需要注意: 1) 删除它会“修复”问题,但它会通过回退到与以后的语言功能不兼容的内置、旧的遗留编译器来“修复”它。 2) 在很多情况下无法进行预编译。如果模型是预编译的,您将如何在模型中显示信息,然后显示对该数据的更改?您在部分视图中依赖于刷新的任何数据都不会更新。

另一个有趣的地方是确保您正在跟踪 roslyn 包中的“build”目录。如果你不这样做,它不会抛出错误,但是当你尝试加载它时它不会编译你的网站。完全跟踪,它只是工作。我们将其部署到其他开发系统,而没有先将其安装在这些系统上,这是可能的,因为它是一个 NuGet 包。

【讨论】:

除非这些功能很关键,否则回退真的不是什么大问题。 至于 #2,不确定您的意思 - 除了声明需要重新编译所有源代码更改之外,没有任何其他问题。 可以解决任何语言功能。让我们想要更新我们的例子是空运算符?和 ??。说 object?.value ?? 0 vs if (object == null || object.value == null) 0 else object.value. 至于#2,我的意思是你不能预编译任何有动态数据的东西。假设我正在显示“驱动程序信息”。我将如何预编译它?我事先不知道是哪个司机。我想你可以在之后使用 jquery 获取数据,但这通常是不必要的。如果您的页面上有模型,则无法预编译。 #2 不。与(预)编译整个应用程序相比,没有“功能”差异。所有动态构建模型的函数(用户输入等)都按原样运行。

以上是关于什么/为什么在 Asp.Net 的 /bin 文件夹中“需要”Roslyn的主要内容,如果未能解决你的问题,请参考以下文章

为啥 AppDomain.CurrentDomain.BaseDirectory 在 asp.net 应用程序中不包含“bin”?

如何以中等信任从 ASP.NET 中的 bin 文件夹加载文件

asp.net mvc3发布(部署)问题。vs2012发布项目缺少文件夹、发布后部署在iis7上网站无法运行

ASP.NET 发布尝试复制不存在的文件

ASP.NET 2.0 AJAX 怎么在原有项目中使用

新的 dll 文件上传到 bin 文件夹后的 ASP.NET 运行时错误