Exception when run Aspnet Mvc app on OS X

694 views Asked by At

I'm trying to run samples for aspnet 5 on os x: git clone https://github.com/shirhatti/Home.git

When I build the project HelloMvc -- 'kpm build' -- it's ok. Then I run app using 'k kestrel' and see the following error:

Missing method Microsoft.Framework.Runtime.ILibraryInformation::get_LoadableAssemblies() in assembly data-0x7feb6aa02a00, referenced in assembly /Users/minya/.kpm/packages/Microsoft.AspNet.Mvc.Core/6.0.0-beta2-11905/lib/aspnet50/Microsoft.AspNet.Mvc.Core.dll System.MissingMethodException: Method not found: 'Microsoft.Framework.Runtime.ILibraryInformation.get_LoadableAssemblies'. at System.Linq.Enumerable+c__Iterator122[Microsoft.Framework.Runtime.ILibraryInformation,System.Reflection.AssemblyName].MoveNext () [0x00000] in <filename unknown>:0 at System.Linq.Enumerable+<CreateSelectIterator>c__Iterator102[System.Reflection.AssemblyName,System.Reflection.Assembly].MoveNext () [0x00000] in :0 at System.Linq.Enumerable+c__Iterator122[System.Reflection.Assembly,System.Reflection.TypeInfo].MoveNext () [0x00000] in <filename unknown>:0 at Microsoft.AspNet.Mvc.ControllerActionDescriptorProvider.BuildModel () [0x00000] in <filename unknown>:0 at Microsoft.AspNet.Mvc.ControllerActionDescriptorProvider.GetDescriptors () [0x00000] in <filename unknown>:0 at Microsoft.AspNet.Mvc.ControllerActionDescriptorProvider.Invoke (Microsoft.AspNet.Mvc.ActionDescriptorProviderContext context, System.Action callNext) [0x00000] in <filename unknown>:0 at Microsoft.Framework.DependencyInjection.NestedProviders.NestedProviderManager1+CallNext[Microsoft.AspNet.Mvc.ActionDescriptorProviderContext].CallNextProvider () [0x00000] in :0 at Microsoft.Framework.DependencyInjection.NestedProviders.NestedProviderManager1[Microsoft.AspNet.Mvc.ActionDescriptorProviderContext].Invoke (Microsoft.AspNet.Mvc.ActionDescriptorProviderContext context) [0x00000] in <filename unknown>:0 at Microsoft.AspNet.Mvc.DefaultActionDescriptorsCollectionProvider.GetCollection () [0x00000] in <filename unknown>:0 at Microsoft.AspNet.Mvc.DefaultActionDescriptorsCollectionProvider.get_ActionDescriptors () [0x00000] in <filename unknown>:0 at Microsoft.AspNet.Mvc.Routing.AttributeRouting.GetActionDescriptors (IServiceProvider services) [0x00000] in <filename unknown>:0 at Microsoft.AspNet.Mvc.Routing.AttributeRouting.CreateAttributeMegaRoute (IRouter target, IServiceProvider services) [0x00000] in <filename unknown>:0 at Microsoft.AspNet.Builder.BuilderExtensions.UseMvc (IApplicationBuilder app, System.Action1 configureRoutes) [0x00000] in :0 at Microsoft.AspNet.Builder.BuilderExtensions.UseMvc (IApplicationBuilder app) [0x00000] in :0 at KWebStartup.Startup.Configure (IApplicationBuilder app) [0x00000] in :0 at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in :0

There is no exact problem in google. I was tried to reinstall kvm, delete and checkout NuGet deps.

Updated: Similar behavior on Windows when I try to run the same project by 'k web':

System.MissingMethodException: Method not found: 'System.Collections.Generic.IEnumerable1<System.Reflection.AssemblyName> Microsoft.Framework.Runtime.ILibraryInformation.g et_LoadableAssemblies()'.
at Microsoft.AspNet.Mvc.DefaultAssemblyProvider.<>c__DisplayClass0.<get_CandidateAssemblies>b__1(ILibraryInformation l)
at System.Linq.Enumerable.<SelectManyIterator>d__14
2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at System.Linq.Enumerable.<SelectManyIterator>d__14
2.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext()
at Microsoft.AspNet.Mvc.ControllerActionDescriptorProvider.BuildModel()
at Microsoft.AspNet.Mvc.ControllerActionDescriptorProvider.GetDescriptors()
at Microsoft.AspNet.Mvc.ControllerActionDescriptorProvider.Invoke(ActionDescriptorProviderContext context, Action callNext)
at Microsoft.Framework.DependencyInjection.NestedProviders.NestedProviderManager
1.CallNext.CallNextProvider()
at Microsoft.Framework.DependencyInjection.NestedProviders.NestedProviderManager1.Invoke(T context)
at Microsoft.AspNet.Mvc.DefaultActionDescriptorsCollectionProvider.GetCollection()
at Microsoft.AspNet.Mvc.DefaultActionDescriptorsCollectionProvider.get_ActionDescriptors()
at Microsoft.AspNet.Mvc.Routing.AttributeRouting.GetActionDescriptors(IServiceProvider services)
at Microsoft.AspNet.Mvc.Routing.AttributeRouting.CreateAttributeMegaRoute(IRouter target, IServiceProvider services)
at Microsoft.AspNet.Builder.BuilderExtensions.UseMvc(IApplicationBuilder app, Action
1 configureRoutes)
at Microsoft.AspNet.Builder.BuilderExtensions.UseMvc(IApplicationBuilder app)
at HelloMvc.Startup.Configure(IApplicationBuilder app) in C:\prj\Home\samples\HelloMvc\Startup.cs:line 18

Seems to be the problem is in one (or more) of referenced in Microsoft.AspNet.Mvc.* assemblies. This is disassemble of DefaultAssemblyProvider from Microsoft.AspNet.Mvc.Core. I guess the problem is in ILibraryManager's implementations GetReferencingLibraries() method. But I can't find this implementation.

public class DefaultAssemblyProvider : IAssemblyProvider
{
    private static readonly HashSet<string> _mvcAssemblyList;
    private readonly ILibraryManager _libraryManager;

    public IEnumerable<Assembly> CandidateAssemblies
    {
        get
        {
            return Enumerable.Select<AssemblyName, Assembly>(Enumerable.SelectMany<ILibraryInformation, AssemblyName>(this.GetCandidateLibraries(), DefaultAssemblyProvider.\u003C\u003Ec__DisplayClass0.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate2 ?? (DefaultAssemblyProvider.\u003C\u003Ec__DisplayClass0.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate2 = new Func<ILibraryInformation, IEnumerable<AssemblyName>>(DefaultAssemblyProvider.\u003C\u003Ec__DisplayClass0.CS\u0024\u003C\u003E9__inst.\u003Cget_CandidateAssemblies\u003Eb__1))), new Func<AssemblyName, Assembly>(DefaultAssemblyProvider.Load));
        }
    }

    static DefaultAssemblyProvider()
    {
        HashSet<string> hashSet = new HashSet<string>((IEqualityComparer<string>) StringComparer.Ordinal);
        string str1 = "Microsoft.AspNet.Mvc";
        hashSet.Add(str1);
        string str2 = "Microsoft.AspNet.Mvc.Core";
        hashSet.Add(str2);
        string str3 = "Microsoft.AspNet.Mvc.ModelBinding";
        hashSet.Add(str3);
        string str4 = "Microsoft.AspNet.Mvc.Razor";
        hashSet.Add(str4);
        string str5 = "Microsoft.AspNet.Mvc.Razor.Host";
        hashSet.Add(str5);
        string str6 = "Microsoft.AspNet.Mvc.Rendering";
        hashSet.Add(str6);
        DefaultAssemblyProvider._mvcAssemblyList = hashSet;
    }

    public DefaultAssemblyProvider(ILibraryManager libraryManager)
    {
        this._libraryManager = libraryManager;
    }

    internal IEnumerable<ILibraryInformation> GetCandidateLibraries()
    {
        return Enumerable.Where<ILibraryInformation>(Enumerable.Distinct<ILibraryInformation>(Enumerable.SelectMany<string, ILibraryInformation>((IEnumerable<string>) DefaultAssemblyProvider._mvcAssemblyList, new Func<string, IEnumerable<ILibraryInformation>>(this._libraryManager.GetReferencingLibraries))), new Func<ILibraryInformation, bool>(DefaultAssemblyProvider.IsCandidateLibrary));
    }

    private static Assembly Load(AssemblyName assemblyName)
    {
        return Assembly.Load(assemblyName);
    }

    private static bool IsCandidateLibrary(ILibraryInformation library)
    {
        return !DefaultAssemblyProvider._mvcAssemblyList.Contains(library.get_Name());
    }
}
2

There are 2 answers

1
Alex Meyer-Gleaves On BEST ANSWER

I had a similar problem on Windows and found the wrong KRE was active.

Executing kvm list shows a list of KRE. In my case the 1.0.0-alpha4 version was active instead of the more recent beta version.

Switching to the default with kvm use default sorted it out for me.

5
elucidan On

I was able to resolve this error by updating my version of KVM, there is probably a simpler way but, assuming you initially installed using homebrew, running these commands should solve your issue

  • brew untap aspnet/k
  • brew tap aspnet/k
  • brew install kvm

then you should be able to run k kestrel

if you get a message that kvm is already installed then:

  • brew link --overwrite mono
  • brew uninstall mono
  • brew reinstall kvm