1

I have a .NET MVC 5 application that I've been developing in Windows for some time. I'd like my Web Designer, who uses a Mac, to be able to run and edit the app locally on his Mac.

Short of building a Windows VM, Mono + Monodevelop/Xamarin Studio seems to be the best way to accomplish this.

When we first built the project, we got an error about the System.Web.Entity.dll reference not loading. We fixed that.

Now, though, we're getting an error that something is missing from the System.Drawing namespace.

System.TypeLoadException
Could not load type 'System.Drawing.BitmapSuffixInSameAssemblyAttribute' from assembly 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

Description: HTTP 500.Error processing request.
Details: Non-web exception.
Exception stack trace:
  at (wrapper managed-to-native) System.MonoCustomAttrs:GetCustomAttributesInternal (System.Reflection.ICustomAttributeProvider,System.Type,bool)
  at System.MonoCustomAttrs.GetCustomAttributesBase (ICustomAttributeProvider obj, System.Type attributeType, Boolean inheritedOnly) [0x00019] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/corlib/System/MonoCustomAttrs.cs:128 
  at System.MonoCustomAttrs.GetCustomAttributes (ICustomAttributeProvider obj, Boolean inherit) [0x00017] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/corlib/System/MonoCustomAttrs.cs:290 
  at System.Reflection.Assembly.GetCustomAttributes (Boolean inherit) [0x00000] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/corlib/System.Reflection/Assembly.cs:244 
  at Owin.Loader.DefaultLoader.SearchForStartupAttribute (System.String friendlyName, IList`1 errors, System.Boolean& conflict) [0x0002c] in <filename unknown>:0 
  at Owin.Loader.DefaultLoader.GetDefaultConfiguration (System.String friendlyName, IList`1 errors) [0x0000e] in <filename unknown>:0 
  at Owin.Loader.DefaultLoader.LoadImplementation (System.String startupName, IList`1 errorDetails) [0x0001e] in <filename unknown>:0 
  at Owin.Loader.DefaultLoader.Load (System.String startupName, IList`1 errorDetails) [0x00000] in <filename unknown>:0 
  at Microsoft.Owin.Host.SystemWeb.OwinBuilder.GetAppStartup () [0x00021] in <filename unknown>:0 
  at Microsoft.Owin.Host.SystemWeb.OwinHttpModule.InitializeBlueprint () [0x0000d] in <filename unknown>:0 
  at System.Threading.LazyInitializer.EnsureInitializedCore[T] (System.Threading.T& target, System.Boolean& initialized, System.Object& syncLock, System.Func`1 valueFactory) [0x00037] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/external/referencesource/mscorlib/system/threading/LazyInitializer.cs:241 
  at System.Threading.LazyInitializer.EnsureInitialized[T] (System.Threading.T& target, System.Boolean& initialized, System.Object& syncLock, System.Func`1 valueFactory) [0x00012] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/external/referencesource/mscorlib/system/threading/LazyInitializer.cs:206 
  at Microsoft.Owin.Host.SystemWeb.OwinHttpModule.Init (System.Web.HttpApplication context) [0x00000] in <filename unknown>:0 
  at System.Web.HttpApplication.CreateDynamicModules () [0x00030] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/System.Web/System.Web/HttpApplication.cs:1676 
  at System.Web.HttpApplication.InitOnce (Boolean full_init) [0x000ad] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/System.Web/System.Web/HttpApplication.cs:218 

I tried dropping the System.Drawing.dll file (and its associated .xml file) from my Windows box into the /bin folder, re-opening the project in Xamarin Studio, and the error changed to

Application Exception
System.InvalidProgramException
Invalid IL code in System.Drawing.BitmapSuffixInSatelliteAssemblyAttribute:.ctor (): method body is empty.

Description: HTTP 500.Error processing request.
Details: Non-web exception.
Exception stack trace:
  at (wrapper managed-to-native) System.MonoCustomAttrs:GetCustomAttributesInternal (System.Reflection.ICustomAttributeProvider,System.Type,bool)
  at System.MonoCustomAttrs.GetCustomAttributesBase (ICustomAttributeProvider obj, System.Type attributeType, Boolean inheritedOnly) [0x00019] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/corlib/System/MonoCustomAttrs.cs:128 
  at System.MonoCustomAttrs.GetCustomAttributes (ICustomAttributeProvider obj, Boolean inherit) [0x00017] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/corlib/System/MonoCustomAttrs.cs:290 
  at System.Reflection.Assembly.GetCustomAttributes (Boolean inherit) [0x00000] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/corlib/System.Reflection/Assembly.cs:244 
  at Owin.Loader.DefaultLoader.SearchForStartupAttribute (System.String friendlyName, IList`1 errors, System.Boolean& conflict) [0x0002c] in <filename unknown>:0 
  at Owin.Loader.DefaultLoader.GetDefaultConfiguration (System.String friendlyName, IList`1 errors) [0x0000e] in <filename unknown>:0 
  at Owin.Loader.DefaultLoader.LoadImplementation (System.String startupName, IList`1 errorDetails) [0x0001e] in <filename unknown>:0 
  at Owin.Loader.DefaultLoader.Load (System.String startupName, IList`1 errorDetails) [0x00000] in <filename unknown>:0 
  at Microsoft.Owin.Host.SystemWeb.OwinBuilder.GetAppStartup () [0x00021] in <filename unknown>:0 
  at Microsoft.Owin.Host.SystemWeb.OwinHttpModule.InitializeBlueprint () [0x0000d] in <filename unknown>:0 
  at System.Threading.LazyInitializer.EnsureInitializedCore[T] (System.Threading.T& target, System.Boolean& initialized, System.Object& syncLock, System.Func`1 valueFactory) [0x00037] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/external/referencesource/mscorlib/system/threading/LazyInitializer.cs:241 
  at System.Threading.LazyInitializer.EnsureInitialized[T] (System.Threading.T& target, System.Boolean& initialized, System.Object& syncLock, System.Func`1 valueFactory) [0x00012] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/external/referencesource/mscorlib/system/threading/LazyInitializer.cs:206 
  at Microsoft.Owin.Host.SystemWeb.OwinHttpModule.Init (System.Web.HttpApplication context) [0x00000] in <filename unknown>:0 
  at System.Web.HttpApplication.CreateDynamicModules () [0x00030] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/System.Web/System.Web/HttpApplication.cs:1676 
  at System.Web.HttpApplication.InitOnce (Boolean full_init) [0x000ad] in /private/tmp/source-mono-mac-4.2.0-branch/bockbuild-mono-4.2.0-branch/profiles/mono-mac-xamarin/build-root/mono-4.2.1/mcs/class/System.Web/System.Web/HttpApplication.cs:218 
Version Information: 4.2.1 (explicit/6dd2d0d Fri Nov 6 12:25:19 EST 2015); ASP.NET Version: 4.0.30319.17020

How can my designer run this .NET MVC 5 app natively on his Mac?

Community
  • 1
  • 1
jonnybot
  • 2,435
  • 1
  • 32
  • 56
  • why do you need to use System.Drawing? can you drop the reference to this library in your original project in Visual Studio? – knocte Jan 13 '16 at 03:38
  • Whatever is referencing System.Drawing is way, way deep inside the .NET MVC framework. I'm not explicitly calling it in my app, nor did I have a reference originally. So, yes, I assume that I need it. If I'm reading the stack trace right, it's mono that's ultimately making the call. – jonnybot Jan 13 '16 at 15:26
  • The call is probably buried in the Owin middleware, actually. It's hard to tell from the Exception where the call/requirement for System.Drawing is being made. – jonnybot Jan 13 '16 at 15:37
  • 1
    ok, hang in there, I have a fix almost ready – knocte Jan 14 '16 at 01:58

1 Answers1

1

I've implemented stubs for the missing types in Mono's BCL, and proposed a pull request.

As it has already been accepted and merged, this problem should be fixed in v.NEXT version of Mono (most likely named 4.4).

knocte
  • 16,941
  • 11
  • 79
  • 125