I am trying to get Mono 3.0 setup to run MVC4 sites under .NET 4 and .NET 4.5. I’ve been working through various errors, what can I do to get it up and running?
Server Configuration
- CentOS 5
- Apache 2.2.3
- 3.2.0 (tarball Sun Jul 28 00:57:40 UTC 2013); ASP.NET Version: 4.0.30319.17020
2013) - Latest XSP from git, as of the time of this post
Apache/Mono Config
MonoServerPath "/usr/local/bin/mod-mono-server4"
/usr/local/bin/mod-mono-server4 contents:
#!/bin/sh exec /usr/local/bin/mono $MONO_OPTIONS "/usr/local/lib/mono/4.5/mod-mono-server4.exe" "<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="230763">[email protected]</a>"
Update
The crux of the problem is that Mono doesn’t ship with MVC4 which the site requires. It still has the MVC3 dlls, yet it has the Razor 2 dlls but not the Razor 1 dlls which MVC3 wants to sue.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Everything you need is now available within the Mono framework or on NuGet. I’ve created downloadable template for MVC4 for .Net 4.0 and .Net 4.5 and some notes on resolving the issues:
The steps from the blog post are:
- git clone
github.com/chrisfcarroll/AspNetTemplatesForMono/Mvc4CSharpRazorFx45Intranet
NB This github repo includes all the required dlls in case you don’t
have NuGet working, so it’s an oversized download. - Open the solution in Xamarin Studio. It almost works out-of-the-box.
The one thing you have to do is choose one of these 2 steps to make
it work:
Either delete Microsoft.Web.Infrastructure.dll from the bin directory and from the project
Or, from the command line:
sudo mkdir /Library/Frameworks/Mono.framework/Versions/3.2.5/etc/mono/registry sudo chmod g+rwx /Library/Frameworks/Mono.framework/Versions/3.2.5/etc/mono/registry
(replacing 3.2.5 with your mono version, which you get at the command line with mono –version);
The Microsoft.Web.Infrastructure.dll is required on .Net on Windows, so deleting it is not the simpler approach if you want cross-platform deployability
Method 2
Success
If you want to run MVC4 on Mono, you need to use some Microsoft dlls which are not provided by Mono at this time.
A word of caution – Taking a cursory look at the Mono source, there appears to be methods and classes in the MC4 source that do not exist in the 3.2.0 build. There may be features that are broken. The site I am running is for all intents and purposes an MVC3 site built against the latest dlls.
Microsoft DLLs to copy
- System.Web.Abstractions – 4.0
- System.Web.Helpers – 2.0
- System.Web.Mvc – 4.0
Once you copy over the dlls, if you’re still having problems you may have to do some detective work if the above fix doesn’t work. If you get an error message saying that Mono can’t find the DLL, it’s usually one of three reasons:
Troubleshooting
- Is doesn’t have the dll – You can try using the Microsoft version of the DLL
- It’s looking for an older version of the DLL when the correct one is installed in the GAC or in your project folder – An assembly in your project is likely referencing that version somewhere. You can use a binding re-direct to force the specific version you have be used instead
- It stil can’t find the dll – Add the assembly in the compilation/assemblies section of your web.config
- You’re getting a ‘can’t find view searched…’ message – if any of the views in that particular views folder have compile errors, then you’ll receive this message.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0