【问题标题】:Compiling Code in Medium Trust以中等信任编译代码
【发布时间】:2010-12-21 22:05:30
【问题描述】:

与 Ben (@BuildStarted) 一起,我们一直在构建 RazorEngine project,它旨在允许您在 ASP.NET MVC 之外编译和解析任意模板。该项目已经发布了一段时间,反馈非常好(感谢所有人!)。 但是,我们遇到了一个问题:中等信任度。

因为我们使用 CSharpCodeProvider 来编译 Razor 生成的类(以加载到当前的 AppDomain 中执行),所以在尝试调用它时遇到了 SecurityException,因为它强制执行了 LinkDemand。当一个普通的 ASP.NET 页面被编译时(不管信任级别如何),它是通过一个通常是 GAC 的BuildProvider 来完成的,因此被隐式地授予了适当的编译权限。因此 ASP.NET WebForms 在中等信任中作为标准工作。

我们的代码没有,我们需要针对我们构建的库不会部署到 GAC 并且在中等信任下运行的场景。所以我们考虑专门为它构建一个BuildProvider 并将编译推迟到 ASP.NET 构建系统,但这似乎过于复杂和脱节,并且提供程序本身既需要通过文件扩展名进行映射,又需要虚拟路径(可能或者可能无法解析为物理文件 - 想想VirtualPathProvider)。这一切似乎有点过头了,只是为了让项目在中等信任下运行;不仅如此,而且纯粹用于 ASP.NET 项目,因为我们的引擎也可以在 ASP.NET 之外运行

所以我的问题是,有人知道在中等信任环境中编译 C# 代码的任何技术或技术吗?

提前致谢。

【问题讨论】:

    标签: c# asp.net compilation razor


    【解决方案1】:

    也许您可以考虑使用 MCS(单声道编译器服务),它可以发送到内存中的程序集而不是文件(是的,我知道 CSharpCodeProvider 只能在内存中,但它仍然会写入临时文件并执行文件系统操作)。

    警告:您可能也会遇到 MCS 的安全问题,但它是开源的(显然)并且我已经能够修改它以便在 Silverlight 中进行表达式编译......只是说,它可能不是会是小菜一碟。

    更新:根据 Mono 路线图页面,我的修改不再需要,因为他们说他们在 2.8 版中支持开箱即用的 Silverlight。

    【讨论】:

    • 我已经考虑过这条路线,但我现在绝对想继续使用更官方的东西 - 但是,我仍然对此持开放态度,如果我找不到解决方案满足我们的需求我相信我们会再次考虑。
    • 根据我的经验,CodeDom 几乎在各个方面都很痛苦。如果您打算进行任何类型的批量编译……除非您想维护和回收一个单独的 AppDomain,否则 CodeDom 是 100% 不可能的。
    • 另外...请记住 CodeDom/CSharpCodeProvider 可以毫无问题地输出字符串,您可以将其输入到替代编译器 (MCS) 中。
    • 只是为了更新这个答案。您是正确的,存在安全问题。我将继续探索这个答案:)
    • @JeffN825:感谢您的建议,不幸的是,我们无法控制 Razor 生成代码的方式,当然,除非我们分叉 Razor 本身来更改底层代码生成。最后,我们坚持使用 BuildProvider 模型。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2013-01-18
    • 2012-12-12
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多