在中等信任中编译代码

Mat*_*ott 9 c# asp.net compilation razor

与Ben(@BuildStarted)一起,我们一直在构建RazorEngine项目,该项目旨在允许您编译和解析ASP.NET MVC之外的任意模板.该项目暂时有几个版本,反馈非常好(感谢大家!).但是,我们遇到了一个问题:中等信任.

因为我们使用CSharpCodeProvider来编译Razor生成的类(加载到当前的AppDomain中以便执行),所以我们SecurityException在尝试调用它时会遇到一个问题,因为它强制执行LinkDemand.当编译正常的ASP.NET页面时(无论信任级别如何),它通过BuildProvider通常为GAC的方式执行此操作,因此可以通过授予适当的编译权限.因此,ASP.NET WebForms在Medium信任中作为标准工作.

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

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

提前致谢.

Jef*_*eff 2

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

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

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