我的网站在 mono 2.10 上运行,我即将在全新服务器上升级到 mono 3.2.x。
它使用 XSP4 工作,ServiceStack Razor View 正确渲染。 (它修复了 2.10 中的许多问题)
当我将站点设置为使用 nginx + Fast CGI (4) 时,我收到了 HttpCompileException,原因是:
The predefined type `System.Collections.Generic.IReadOnlyList' is defined multiple times. Using definition from `mscorlib.dll'
记住这在 xsp4 上工作得很好,所以我认为它需要一些设置才能将它绑定(bind)到一个 .Net 实例,也许它在 .net 4.0 和 .net 4.5 之间混淆了?关于如何强制它仅使用其中之一有什么建议吗?
注意:我使用最新版本 (3.2.7) 从 git 安装,因为 3.2.5 版本会崩溃。我使用的是干净的 Amazon EC2 Ubuntu 12.04 64 位。它以前没有单声道,当我尝试 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
最佳答案
我发现了问题所在并能够解决它。
罪魁祸首是这些文件: https://github.com/mono/xsp/tree/master/src/Mono.WebServer.FastCgi/Compatibility
出于某种原因,他们添加了这些编译为 NET 4.0 目标的兼容性类(没有 IReadOnlyList 类),但是当我们运行 fastcgi-mono-server4 时,它在 4.5 运行时下运行,这会导致有一个 IReadOnlyList 类,因此会生成 Razor HttpCompile 错误。
解决方案是将这 2 个参数 -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 项目的最新发布版本,该项目没有这些兼容性类。
关于Mono 3.2.x 上的 Razor 引擎,具有快速 CGI - 目标特定的 .net?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435895/