12

StackOverflow和整个互联网上,关于 C# 编译器Roslyn的讨论很多。很多人问罗斯林是什么以及为什么,而其他人则问如何摆脱它

我的问题与后一个问题有关。正如Kemal Kefeli这里引用的那样,但经常逐字逐句地重复几十个(例如另一个迭代示例),以删除 Roslyn:

当你创建一个新的 Web 项目时,两个NuGet包会自动添加到你的项目中。如果你删除它们,你的问题应该得到解决。包名称为:“ Microsoft.CodeDom.Providers.DotNetCompilerPlatform ”和“ Microsoft.Net.Compilers ”。

但是,如果您使用 Roslyn 提供的 C# 6 功能,则此方法不起作用。通过删除这两个 nugget 包,您将放弃使用这些功能的任何机会。

我的问题是,您如何使用 Roslyn 编译所有内容,但避免发生任何运行时编译器操作,最重要的是csc.exe,避免将vbc.exe、 和VBCSCompiler.exe放入最终版本(在 Roslyn 文件夹中)。

我正在将StackOverflow 的 Opserver移植到一个软件中。该软件允许用户在其中托管嵌入式 Web 服务器和网页。但是,该软件对允许上传的内容非常挑剔,出于安全原因,不允许在运行时上传和执行可执行文件,如 Roslyn 文件夹中的那些

Opserver依赖于 C# 6 功能,因为如果我删除这两个NuGet包,错误就会在编译生成的文件中出现。但是,如果我更简单地恢复为使用 C#5.0 编译器进行严格编译,那么我们会清楚地看到这一点:

5.0 错误## 标题##

如果我在发布时保留NuGet包并取消选中allow precompiled site to be updatable,以禁止 Roslyn 在运行时编译文件,然后是Rutix评论:

请记住,删除这些包 [如Kemal Kefeli所说] 将破坏 C# 6 功能的使用。这可以通过取消选中预编译视图等的“允许预编译的站点可更新”来解决。

不要在运行时编译

它仍然在 Roslyn 文件夹中生成可执行文件和相关的 DLL,但 DLL 的数量要少得多。我怎样才能在运行时删除 Roslyn 依赖项,从而从输出版本中删除可执行文件,并在编译时严格编译所有内容

4

1 回答 1

3

在完全预编译的 ASP.NET 项目(“允许预编译的站点可更新”禁用)中,无需使用应用程序恕我直言部署编译器。

我在我的 .NET 4.6 ASP.NET 应用程序(Web 窗体和 MVC 的混合)中使用 Roslyn,从已发布站点中删除 Roslyn 文件夹\文件后,预编译的应用程序工作得很好......

更新:一段时间后,发现部署包中没有 Roslyn 的唯一地方是在浏览器中访问 ASMX(旧式 ASP.NET SOAP Web 服务)的问题 - ASMX 的“帮助”页面显然是在运行时构建的,即使完全预编译的 ASP.NET 应用程序并引发异常(尽管 WS 本身运行正常)

于 2017-08-30T12:10:17.877 回答