我可以使用System.CodeDom访问在F#Interactive中创建的类型吗?

时间:2011-04-21 17:26:37

标签: f# razor

我在FSX中创建我的类型,并将这些类型传递到具有开源RazorEngine project的Razor模板引擎。

在ASP.NET之外托管Razor需要编译Razor模板。如果我将在FSX中创建的模型传递给模板,System.CodeDom是否能够访问由FSI创建的那种类型?我得到的基本错误是“无法找到类型或命名空间名称'FSI_0004'。”

1 个答案:

答案 0 :(得分:4)

使用System.CodeDom编译的代码通常无法访问F#Interactive中加载的代码 - CodeDom基本上将C#/ F#源代码写入磁盘,然后在代码上调用命令行编译器(和命令)行编译器不能引用F#Interactive中加载的代码。

可能有办法让它工作 - 您可以使用PowerPack中的F#CodeDom提供程序。您可以修改它以生成源代码(就像当前一样),然后将生成的代码发送到F#Interactive(而不是调用命令行编译器)。这样,即时编译的代码可以看到F#Interactive代码。

有一些问题需要解决

  • 是否可以为RazorEngine提供自己的CodeDom提供程序?
  • F#CodeDom提供程序可能无法正确处理Razor生成的代码(因此您可能需要修复/解决F#CodeDom提供程序中的一些问题)。您可能还需要对其进行修改以生成与F#interactive完美配合的代码(例如,删除顶级命名空间)
  • 您想使用哪种F#Interactive实例? (以及如何获得标准输入,以便您可以在那里发送代码)
  • 您是否需要加载已编译的程序集并将其传递回Razor?我不确定这是否可以用F#Interactive完成。

这些都取决于你的情况 - 但我想有可能得到你想要的东西(可能有一些解决方法)。