与Ben(@BuildStarted)一起,我们一直在构建RazorEngine project,它旨在允许您编译和解析ASP.NET MVC之外的任意模板。该项目暂时有几个版本,反馈非常好(感谢大家!)。 但,我们遇到了一个问题:中等信任。
因为我们使用CSharpCodeProvider来编译Razor生成的类(加载到当前的AppDomain中以便执行),所以在尝试调用它时会遇到SecurityException
,因为它上面强制执行LinkDemand。当编译普通的ASP.NET页面时(无论信任级别如何),它都是通过BuildProvider
进行的,这通常是GAC,因此可以通过授予适当的编译权限。因此,ASP.NET WebForms在中等信任中作为标准工作。
我们的代码没有,我们需要针对我们的构建库不会部署到GAC并以中等信任运行的方案。所以我们考虑专门为它构建一个BuildProvider
并将编译推迟到ASP.NET构建系统,但这似乎过于复杂和脱节,并且提供者本身需要通过文件扩展名和虚拟路径进行映射(可能会或可能不会解析为物理文件 - 请VirtualPathProvider
)。这一切似乎都是过度的,只是为了让项目在中等信任中运作;不仅如此,而且纯粹用于ASP.NET项目,因为我们的引擎也可以在ASP.NET之外工作
所以我的问题是,有人知道在中型信任环境中编译C#代码的任何技术或技术吗?
提前致谢。
答案 0 :(得分:2)
也许您可以考虑使用MCS(单声道编译器服务),它可以发送到内存程序集而不是文件(是的,我知道CSharpCodeProvider只能在内存中,但它仍然写入临时文件并执行文件系统操作。)
警告:你可能也会遇到MCS的安全问题,但它是开源的(很明显)并且我已经能够修改它以便在Silverlight中进行表达式编译...只是说,它可能不是将是一块蛋糕。更新:根据Mono路线图页面,我的修改不再是必要的,因为他们说它们在2.8版本中支持Silverlight。