seesharper / LightInject.Interception

LightInject.Interception supports Aspect Oriented Programming through proxy-based method interceptors.
11 stars 7 forks source link

Could not load type with LightInject.Interception + Microsoft DI #13

Closed blipson89 closed 7 years ago

blipson89 commented 7 years ago

I'm getting a type load yellow screen when trying to load an MVC controller that has a dependency. I'll post the yellow screen at the bottom of this. I'm using Microsoft Dependency Injection. The container registration is in one project (let's call it ProjectDI), and the class the controller that's throwing an error is in another project (let's call it ProjectMVC).

ProjectMVC references ProjectDI. The dependency (CreatorLog) is being registered in ProjectMVC by adding it to the IServiceCollection. The intercept code in ProjectDI gets the list of ServiceDescriptors and registers them like this:

foreach (ServiceDescriptor descriptor in serviceCollection)
{
    string assemblyName = descriptor.ServiceType.AssemblyQualifiedName ?? "";
    if (WhitelistedAssemblies.Any(assemblyName.StartsWith))
    {
        container.Intercept(s => s.ServiceType == descriptor.ServiceType, i => new MiniProfilerInterceptor());
    }
}

The stack trace I'm getting is:

[TypeLoadException: Could not load type 'CreatorLogProxyProxy' from assembly 'LightInject.Interception.ProxyAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.]
   System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule module, Int32 tk, ObjectHandleOnStack type) +0
   System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() +1765
   System.Reflection.Emit.TypeBuilder.CreateTypeInfo() +95
   LightInject.Interception.TypeBuilderFactory.CreateType(TypeBuilder typeBuilder) in C:\projects\lightinject-interception\build\tmp\Net46\Binary\LightInject.Interception\LightInject.Interception.cs:1093
   LightInject.Interception.ProxyBuilder.GetProxyType(ProxyDefinition definition) in C:\projects\lightinject-interception\build\tmp\Net46\Binary\LightInject.Interception\LightInject.Interception.cs:1203
   LightInject.InterceptionContainerExtensions.CreateProxyServiceRegistration(ServiceRegistration registration, Type[] additionalInterfaces, IServiceFactory serviceFactory, Action`2 defineProxyType) in C:\projects\lightinject-interception\build\tmp\Net46\Binary\LightInject.Interception\LightInject.Interception.cs:156
   LightInject.ServiceContainer.EmitNewInstanceWithDecorators(ServiceRegistration serviceRegistration, IEmitter emitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3180
   LightInject.ServiceContainer.CreateDynamicMethodDelegate(Action`1 serviceEmitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3044
   LightInject.ServiceContainer.CreateInstanceDelegateIndex(Action`1 emitMethod) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3862
   LightInject.ServiceContainer.EmitLifetime(ServiceRegistration serviceRegistration, Action`1 emitMethod, IEmitter emitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3851
   LightInject.<>c__DisplayClass152_0.<CreateEmitMethodWrapper>b__0(IEmitter ms) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3122
   LightInject.ServiceContainer.EmitConstructorDependency(IEmitter emitter, Dependency dependency) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3421
   LightInject.ServiceContainer.EmitConstructorDependencies(ConstructionInfo constructionInfo, IEmitter emitter, Action`1 decoratorTargetEmitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3383
   LightInject.ServiceContainer.EmitNewInstanceUsingImplementingType(IEmitter emitter, ConstructionInfo constructionInfo, Action`1 decoratorTargetEmitMethod) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3344
   LightInject.ServiceContainer.EmitNewInstance(ServiceRegistration serviceRegistration, IEmitter emitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3301
   LightInject.ServiceContainer.CreateDynamicMethodDelegate(Action`1 serviceEmitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3044
   LightInject.ServiceContainer.CreateInstanceDelegateIndex(Action`1 emitMethod) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3862
   LightInject.ServiceContainer.EmitLifetime(ServiceRegistration serviceRegistration, Action`1 emitMethod, IEmitter emitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3851
   LightInject.<>c__DisplayClass152_0.<CreateEmitMethodWrapper>b__0(IEmitter ms) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3122
   LightInject.ServiceContainer.EmitConstructorDependency(IEmitter emitter, Dependency dependency) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3421
   LightInject.ServiceContainer.EmitConstructorDependencies(ConstructionInfo constructionInfo, IEmitter emitter, Action`1 decoratorTargetEmitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3383
   LightInject.ServiceContainer.EmitNewInstanceUsingImplementingType(IEmitter emitter, ConstructionInfo constructionInfo, Action`1 decoratorTargetEmitMethod) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3344
   LightInject.ServiceContainer.EmitNewInstance(ServiceRegistration serviceRegistration, IEmitter emitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3301
   LightInject.ServiceContainer.CreateDynamicMethodDelegate(Action`1 serviceEmitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3044
   LightInject.ServiceContainer.CreateInstanceDelegateIndex(Action`1 emitMethod) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3862
   LightInject.ServiceContainer.EmitLifetime(ServiceRegistration serviceRegistration, Action`1 emitMethod, IEmitter emitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3851
   LightInject.<>c__DisplayClass152_0.<CreateEmitMethodWrapper>b__0(IEmitter ms) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3122
   LightInject.ServiceContainer.CreateDynamicMethodDelegate(Action`1 serviceEmitter) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3044
   LightInject.ServiceContainer.CreateDelegate(Type serviceType, String serviceName, Boolean throwError) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3909
   LightInject.ServiceContainer.CreateDefaultDelegate(Type serviceType, Boolean throwError) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:3872
   LightInject.ServiceContainer.TryGetInstance(Type serviceType) in C:\projects\lightinject\build\tmp\Net46\Binary\LightInject\LightInject.cs:2742
   Sitecore.Mvc.Controllers.SitecoreDependencyResolver.GetService(Type serviceType) +38
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +59

The MVC controller is registered, as is the dependency.

seesharper commented 7 years ago

Can you create a small repro that we can PR into?

blipson89 commented 7 years ago

Thanks for the quick reply! I'll see if I can reproduce it on a smaller scale and circle back with you.

blipson89 commented 7 years ago

@seesharper I'm going to close this one out. It seems to be working fine now. I think there was an underlying issue with a dependency somewhere far down the rabbit hole and the error in the stack trace I posted was probably just a red herring.

I'm enjoying LightInject so far - thank you for the support!

seesharper commented 7 years ago

Good stuff :)