我正在尝试使用Visual Studio 2015和.NET 4.5.1创建Web应用程序.当我发布网站时,visual studio创建了名为的文件夹roslyn.
我知道它用于动态编译代码,但不幸的是我的托管服务提供商不允许我在他们的服务器上执行编译器.
如何在不使用roslyn以前版本的Visual Studio的情况下发布网站?
编辑:我试图访问我的网站时遇到此错误.
似乎IIS尝试执行roslyn\csc.exe但我的用户帐户没有这样做的权限.使用以前版本的Visual Studio,此错误不会显示.
有很多关于StackOverflow上的C#编译器Roslyn和一般的互联网的讨论.很多人问罗斯林的原因和原因,而其他人则问如何摆脱它.
我的问题与后一个问题有关.正如Kemal Kefeli从这里引用的那样,但经常多次逐字迭代(例如迭代的另一个例子),以便删除Roslyn:
创建新的Web项目时,会自动将两个NuGet包添加到项目中.如果你删除它们,你的问题应该解决.包名称为:" Microsoft.CodeDom.Providers.DotNetCompilerPlatform "和" Microsoft.Net.Compilers ".
但是,如果您使用Roslyn提供的C#6功能,则此方法不起作用.通过删除这两个块包,您放弃了使用这些功能的任何机会.
我的问题是,你如何编译一切与罗斯林,但避免任何编译器在运行时发生的行为,最重要的是csc.exe,vbc.exe和VBCSCompiler.exe被放置在最终发布版本(在罗斯林文件夹).
我正在将StackOverflow的 Opserver移植到一个软件中.该软件允许用户从其中托管嵌入式Web服务器和网页.不过,该软件是什么,它允许被上传和可执行文件,就像那些在罗斯林文件夹中找到非常挑剔,都不会允许被上传,并在运行时执行,由于安全方面的原因.
Opserver依赖于C#6功能,因为如果删除这两个 NuGet包,则会在编译生成的文件中出错.但是,如果我更简单地恢复使用 C#5.0编译器严格编译,那么我们清楚地看到了这一点:
如果我离开的NuGet包存在,并且取消allow precompiled site to be updatable发布时,为了与编译后在运行时的文件,以禁止罗斯林为随后Rutix从"的评论在这里:
请记住,删除这些软件包[由Kemal Kefeli讲述]将打破C#6功能的使用.这可以通过取消选中"允许预编译的站点可更新"来解决,该预先编译视图等.
它仍然在Roslyn文件夹中生成可执行文件和相关的DLL,但是DLL却少得多.我怎样才能在运行时删除Roslyn依赖项,从而从输出版本中删除可执行文件并在编译时严格编译所有内容?
为了在MVC5下?.的.cshtml文件中使用C#6功能(如),在部署时需要在网站的bin文件夹中包含csc.exe和相关文件.好的,我能理解其中的原因.
但是,现在这意味着我的网络服务器上有一个完整的C#编译器,具有与网站用户相同的权限.这让我犹豫不决 - 理论上,攻击者可以使用它来运行任意代码,就好像它是我的网站一样.
这实际上是一个有效的安全问题吗?
我可以看到双方:一方面,它可能是你需要执行任意代码的能力已经为了能够任意代码传递给CSC可执行文件.另一方面,通过运行我们永远不想写的代码,我可以看到对它的访问被用来访问内部网站设置(如数据库连接字符串).
我应该担心,还是认为安全?