关于 StackOverflow 和整个互联网上的C#编译器Roslyn已经有很多讨论。很多人用Roslyn问what and why,而其他人问如何get rid of it。
我的问题与后一个问题有关。正如来自here的 Kemal Kefeli 所引用,但经常多次逐字迭代(例如another example次迭代),以便删除Roslyn:
创建新的Web项目时,会自动将两个 NuGet 包添加到您的项目中。如果你删除它们,你的问题应该解决。软件包名称为:" Microsoft.CodeDom.Providers.DotNetCompilerPlatform "和" Microsoft.Net.Compilers "。
但是,如果您使用Roslyn提供的C#6功能,则此方法不起作用。通过删除这两个块包,您放弃了使用这些功能的任何机会。
我的问题是,如何使用Roslyn编译所有内容,但避免发生任何编译器运行时操作,最重要的是,csc.exe
,vbc.exe
和VBCSCompiler.exe
来自被放置在最终版本中(在Roslyn文件夹中)。
我将 StackOverflow的 Opserver 移植到一个软件中。该软件允许用户从其中托管嵌入式Web服务器和网页。但是,该软件对于允许上传的内容非常挑剔,并且由于安全原因,可执行文件(如Roslyn文件夹中的文件) 允许在运行时上传和执行。
Opserver 依赖于C#6功能,因为如果删除这两个 NuGet 软件包,则会在编译生成的文件中出现错误。但是,如果我更简单地回复到compile strictly with C#5.0编译器,那么我们可以清楚地看到这一点:
如果我保留 NuGet 包并在发布时取消选中allow precompiled site to be updatable
,以禁止Roslyn在运行时编译文件,然后 Rutix &# 39;来自here的评论:
请记住,删除这些软件包[由 Kemal Kefeli 告知]将打破C#6功能的使用。这可以通过取消选中"允许预编译的站点可更新来解决。预编译视图等。
它仍然在Roslyn文件夹中生成可执行文件和相关的DLL,但是DLL却少得多。我怎样才能在运行时删除Roslyn依赖项,从而从输出版本中删除可执行文件,并在编译时严格编译一切?
答案 0 :(得分:2)
在完全预编译的ASP.NET项目中("允许预编译的站点可更新"禁用),不需要使用app IMHO部署编译器。
我在我的.NET 4.6 ASP.NET应用程序中使用Roslyn(Web窗体和MVC的混合)和预编译的应用程序在从已发布的站点中删除Roslyn文件夹\文件后工作正常......
UPDATE :过了一段时间,在部署包中找不到Roslyn的地方是问题,那就是在浏览器中访问ASMX(旧式ASP.NET SOAP Web服务) - "帮助" ASMX的页面显然是在运行时构建的,即使是完全预编译的ASP.NET应用程序,它也会引发异常(尽管WS本身运行正常)