Mono 3.2.x上带有快速CGI的Razor引擎 – 目标特定.net?

我的网站在单声道2.10上工作,我几乎完成升级到单声道3.2.x的全新服务器。

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

当我设置网站使用nginx +快速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之间混淆? 关于如何强迫它只使用其中一个的任何build议?

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

这与以下大致相同的错误: 单引号上的RazorEngine – 抛出TemplateCompilationException

但是我没有安装其他版本。 构build过程添加了其他已被删除的内容。 mscorlib的所有实例都在这里:

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

我发现问题是什么,并能解决这个问题。

罪魁祸首是这些文件: 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项目,没有这些兼容性类。