我可以访问在F#Interactive with System.CodeDom中创建的类型吗?
我正在FSX中创建我的类型,并将这些类型通过开放源代码传递到Razor模板引擎中我可以访问在F#Interactive with System.CodeDom中创建的类型吗?,f#,razor,F#,Razor,我正在FSX中创建我的类型,并将这些类型通过开放源代码传递到Razor模板引擎中 在ASP.NET之外托管Razor需要编译Razor模板。如果我将在FSX中创建的模型传递到模板中,System.CodeDom是否能够访问由FSI创建的类型?我得到的基本错误是“找不到类型或名称空间名称‘FSI_0004’。使用系统编译的代码。CodeDom通常无法访问F#Interactive中加载的代码-CodeDom基本上将C#/F#源代码写入磁盘,然后在代码上调用命令行编译器(并且命令行编译器无法引用F#
在ASP.NET之外托管Razor需要编译Razor模板。如果我将在FSX中创建的模型传递到模板中,System.CodeDom是否能够访问由FSI创建的类型?我得到的基本错误是“找不到类型或名称空间名称‘FSI_0004’。使用
系统编译的代码。CodeDom通常无法访问F#Interactive中加载的代码-CodeDom基本上将C#/F#源代码写入磁盘,然后在代码上调用命令行编译器(并且命令行编译器无法引用F#Interactive中加载的代码)
也许有一种方法可以让它工作——您可以使用来自的F#CodeDom提供程序。您可以修改它以生成源代码(正如它当前所做的那样),然后将生成的代码发送到F#Interactive(而不是调用命令行编译器)。这样,动态编译的代码可以看到F#Interactive代码
有一些问题需要解决
- 是否可以向RazorEngine提供您自己的CodeDom提供程序
- F#CodeDom提供程序可能无法正确处理Razor生成的代码(因此您可能需要修复/解决F#CodeDom提供程序中的一些问题)。您还可能需要修改它以生成与F#interactive配合良好的代码(例如,删除顶级命名空间)
- 您希望使用什么样的F#Interactive实例?(以及如何获取标准输入,以便将代码发送到那里)
- 您是否需要加载已编译的程序集并将其传递回Razor?我不确定是否可以使用F#Interactive完成此操作
这些都取决于您的场景,但我想可能会得到您想要的(可能需要一些变通方法).谢谢Tomas。我将研究F#CodeDom。我不是100%确定,但我认为Razor需要加载程序集,因此FSI很可能是不匹配的。最简单的解决方案是将其转换为命令行工具。另一种解决方法是在Razor模板顶部添加@model dynamic注释。这会导致模板使用f#类型通过“动态”引用,避免了编译时对f#类型的依赖。