具有快速CGI的Mono 3.2.x上的Razor Engine - 目标特定的.net?

时间:2013-12-07 00:20:55

标签: razor nginx mono servicestack fastcgi

我的网站适用于单声道2.10,我几乎完成了升级到单声道3.2.x的全新服务器。

它使用XSP4,ServiceStack Razor视图正确呈现。 (它在2.10中修复了很多人工制品)

当我将网站设置为使用nginx + Fast CGI(4)但是我得到了一个HttpCompileException,原因是:

The predefined type `System.Collections.Generic.IReadOnlyList' is defined multiple times. Using definition from `mscorlib.dll'

请记住这适用于xsp4,所以我认为它需要一些设置才能将它绑定到一个.Net实例,也许它在.net 4.0和.net 4.5之间混淆了?关于我如何强制它只使用其中一个的任何建议?

注意:我使用最新版本(3.2.7)从git安装,因为3.2.5版本会崩溃。我使用的是干净的Amazon EC2 Ubuntu 12.04 64bit。它之前没有单声道,当我尝试3.2.5时,它是另一个现在被删除的实例。

这与以下内容大致相同:RazorEngine on Mono - TemplateCompilationException thrown

但我没有安装其他版本。构建过程添加了其他已删除但无效的构建过程。 mscorlib的所有实例都在这里:

/usr/lib/mono/2.0/mscorlib.dll
/usr/lib/mono/4.5/mscorlib.dll
/usr/lib/mono/4.0/mscorlib.dll

1 个答案:

答案 0 :(得分:2)

我发现问题是什么,并且能够解决它。

罪魁祸首是这些文件: https://github.com/mono/xsp/tree/master/src/Mono.WebServer.FastCgi/Compatibility

出于某种原因,他们添加了这些编译为.NET 4.0目标(它没有IReadOnlyList类)的可比性类,但是当我们运行fastcgi-mono-server4时,它运行在4.5运行时,这样做有一个IReadOnlyList类,因此生成Razor HttpCompile错误。

解决方案是将这两个参数-d:NET_4_5 -sdk:4.5添加到FastCGI源项目的Makefile.in中:

@NET_4_0_TRUE@  $(DMCS) -d:NET_2_0 -d:NET_4_0 -d:NET_4_5 -sdk:4.5 $(MCSFLAGS) $(references4) /out:$@ \

然后我重新编译并重新安装./configure,make,make install并且Razor编译错误已经消失了。

如果您不想解决所有这些问题,我建议您坚持使用最新发布的xsp项目版本,该版本没有这些兼容性类。