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


75

有一堆相关的问题在此,虽然大部分的答案定义罗斯林和/或提供“修复”一些问题(exe与托管服务提供商等)

我似乎无法追踪的是中的“为什么”和“目的”(也许仅在ASP.Net MVC / Web API的上下文中)/bin/roslyn

我遇到了类似的问题(托管-.exe限制,支持4.6等),我的“解决方案”是“仅部署到Azure”(当然,一切正常。)但是实际上,这并不能回答:

  • 为什么需要它们?
  • 这是否意味着它们被用于runtime编译(我的大脑指出了这一点,但这是一个完整的猜测/我也许是错的骗子),如该SO帖子所示-除非更正,否则为“它”(下文中有更多介绍)。
  • 似乎“删除软件包”是一个“修复” (根据过去的一些答案)但如果是这样,它(重新)会产生问题

我认为了解这一点将有所帮助-例如,我不能成为唯一看到.exe“需要”的人而扬眉的人。


更新资料

证明“隐藏的宝石”的存在:)我已经读了一遍又一遍...毕竟它已经存在了一段时间了- 不是评论线程-最初引用的链接(大约在2014年)已由Microsoft和注释不再显示。幸运的是,下面是相关部分。

大错误-一直在盯着我(或至少自从这次交流以来):

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.exe,在同一文件夹它坐落。VBCSCompiler.exe 是执行实际编译工作的过程。如果VBCSCompiler已经在运行,则csc.exe将对其进行重用,因此我们仍将获得所提及的性能改进。

嗯...


更新:10/2017

似乎这与所有时间有关,因此需要进一步更新。

@Donny V下面答案是一个选择。通过完全编译您的应用程序(包括所有Views.cshtml/ .vbhtml)),您无需exe在应用程序中使用它。

即使Visual Studio(到今天,VS 2017,令人困惑)仍会/bin/roslynPublish过程中创建及其内容,即使设置了“ full compile”,也是如此

您可以通过测试该排除/bin/roslyn文件夹,并推动应用程序到你的托管服务提供商时,它的内容。

警告

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


您正在使用实体框架吗?
Jeroen Vannevel 2015年

@JeroenVannevel-目前尚不明确,但是
细节

因此,EF被添加为该项目的参考吗?直到最近的PR EF都依赖于Roslyn。
Jeroen Vannevel

1
@JeroenVannevel是的,尽管要提供内存,但这是来自默认脚手架(除非我将Nuget更新为“最新” EF)。仍然我不了解它与“需要”部署中的可执行文件(.exe)的关系-也许只是库/ dll,但是部署环境中需要执行什么?exe
EdSF

1
@PederRice任何SO领域的MS人员都可以对此进行更正。如果遇到托管问题(限制exe),则可以在项目中删除这些软件包如果这样做,则需要调试代码-如果您使用的是某些新功能或具有Roslyn依赖项的功能,则事情将会中断。不幸的是,一种“安全”的方法将还原为4.5.x-如果没有为Azure部署计划一个项目,这是我个人的“修复” 。
EdSF '16

Answers:


34

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

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

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

如果在视图(MVC项目)中使用了某些新的C#6.0语言功能,则将无法编译。我的许多意见都使用?。用于检查模型属性的null检查运算符。所有这些视图现在都在我的Godaddy托管MVC 5应用程序上返回错误。

发生此错误的原因是,视图(默认情况下)是在运行时使用.NET管道(未预编译)进行编译的。

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

只是想让任何看着这个问题的人知道卸载它的后果以及为什么首先要解决这个问题


谢谢。这几乎意味着整个网站vb/cs/html都已编译(包括前端视图文件,因此对于所有人而言可能都不可行(必须重新编译整个网站以实现涉及视图的“简单”前端更改)。此外,最后我“发布了”,甚至‘上完全编译’开关,它仍将输出exe文件中/bin/roslyn.....
EDSF

3
只是想让任何查看此问题的人都知道卸载它的后果以及为什么首先要出现此问题。
Donny V.

如果您使用动态数据进行回发,则会破坏您的网站。
约翰·罗德,

9

由于无法删除bin / roslyn中的较旧文件,因此无法重建项目的Visual Studio 2017 Community Edition一直都在遇到此问题。基于OP的Gold注释,我现在使任务管理器保持打开状态(Ctrl + Shift + Esc),并终止VBCS.exe进程。现在可以删除bin / roslyn中有问题的文件。


1

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


1
谢谢,尽管对此感到困惑。exebin/roslyn“发布” Asp.Net应用程序(编译/构建)的过程中创建in 。
EdSF,2016年

1
Roslyn组件也通过参考包和块包进入源代码,因此它们可用于建筑物,我相信bin中的东西可用于任何JIT(剃刀),也可用于从MSIL到系统上的本机运行该应用程序。
保罗·斯威兹

0

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

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

最早是在2008年由Anders Hejlsberg在PDC会议上提到的,后来成为Roslyn,但直到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?


谢谢。我认为“什么”很清楚,这是“为什么”,更具体地说,为什么即使在Web应用程序已完全编译的exe情况下,在Web应用程序上下文中需要可执行文件(),换句话说,“ “什么都没有”在运行时留下来进行编译(所有内容都已经预编译了)-丢弃/排除整个roslyn文件夹只是“好”。
EdSF '19

0

需要注意的两件事:1)删除它可以“解决”问题,但是可以通过回退到与以后的语言功能不兼容的内置,旧的,传统的编译器来“解决”该问题。
2)在许多情况下,无法进行预编译。如果模型中的信息已经过预编译,您将如何显示它们,然后显示对该数据的更改?您依赖于局部视图进行刷新的任何数据将永远不会更新。

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


除非这些功能很关键,否则回退实际上并不是什么大问题。
EdSF

至于#2,不确定您的意思-除了针对所有源更改重新声明的需求外,没有任何其他问题。
EdSF

任何语言功能都可以解决。使我们想要更新我们的示例的示例将是null运算符?和??。说object?.value更干净 0 vs if(object == null || object.value == null)0 else object.value。
约翰·罗德,

至于#2,我的意思是您不能预编译具有动态数据的任何内容。假设我正在显示“驾驶员信息”。我将如何预编译?我事先不知道它是哪个驱动程序。我想您以后可以使用jquery获取数据,但这通常是不必要的。如果页面上有模型,则无法进行预编译。
约翰·罗德,

#2不 (预)编译整个应用程序没有“功能”上的区别。动态构建模型的所有功能(用户输入等)均按原样运行。
EdSF
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.