在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 编译器进行严格编译,那么我们会清楚地看到这一点:
如果我在发布时保留NuGet包并取消选中allow precompiled site to be updatable
,以禁止 Roslyn 在运行时编译文件,然后是Rutix的评论:
请记住,删除这些包 [如Kemal Kefeli所说] 将破坏 C# 6 功能的使用。这可以通过取消选中预编译视图等的“允许预编译的站点可更新”来解决。
它仍然在 Roslyn 文件夹中生成可执行文件和相关的 DLL,但 DLL 的数量要少得多。我怎样才能在运行时删除 Roslyn 依赖项,从而从输出版本中删除可执行文件,并在编译时严格编译所有内容?