Por que estou recebendo a exceção de reflexão “Estado interno inválido” com Castle DynamicProxy?

StackOverflow https://stackoverflow.com/questions/2289361

Pergunta

Adicionamos DynamicProxy ao nosso aplicativo web ASP.NET há algumas semanas.O código funcionou bem no desenvolvimento e no controle de qualidade, mas quando enviamos para produção, obtivemos a seguinte exceção (somente no topo do rastreamento de pilha):

[ArgumentNullException: Invalid internal state.]

System.reflection.emit.typebuilder._internalSetMethodil (Int32 MethodHandle, isinitlocals booleanos, byte [] corpo, byte [] localsig, int32 sigLenTenTent, Int32 maxstackSize, int32 numExceptions, __ExcepthinStância [] Exception Módulo módulo) +0 system.reflection.emit.typebuilder.internalSetMethodil (Int32 MethodHandle, isinitlocals booleanos, byte [] corpo, byte [] localStig, sigLength, siglength, maxStacksize, int32, interescensexcepthinStince [] Int32[] rvaFixups, Module module) +56 System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() +1033 System.Reflection.Emit.TypeBuilder.CreateType() +99 Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CreateType(TypeBuilder type ) +72 Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType() +96 Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateType(String name, Type[] interfaces, INamingScope namingScope) +854 Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode (Type[] interfaces, ProxyGenerationOptions options) +834 Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxyType(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options) +133 Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options ) +52 castle.dynamicproxy.proxyGenerator.createclassProxy (tipo classtoproxi, tipo [] adicional entefacestoproxy, proxygeneationOptions Opções, objeto [] construtor (] tipo (] timersOxySker (] timersOnTerTerTerTerTerTroxinator, tipoMotSoxyPrator, sinais de sinais de sepção. Interfacestoproxy, Opções de proxygenerationOptions, IInterceptor [] interceptores) +48 castle.dynamicproxy.proxyGenerator.createclassProxy (type classtoproxy, opções de proxygenerationOptions, iinterceptor [] interceptores) +44

Funcionou bem quando enviamos o código pela primeira vez, e uma redefinição do IIS o corrigiu, então presumo que seja relacionado ao thread, mas não consegui encontrar nada nas interwebs sobre as práticas recomendadas para geração de proxy com segurança de thread.Sugestões?

ATUALIZAR:Depois de ler um pouco mais sobre o assunto, especialmente aqui, percebi um problema potencial - ou seja, que não havia substituído Equals/GetHashCode para a implementação de IProxyGenerationHook que havia escrito, o que impediria o DynamicProxy de armazenar em cache seus tipos.Como não consigo encontrar quase nada na exceção que vi em geral e muito menos relacionada ao DP, vou assumir que foi a falta de cache de tipos causada pela minha omissão que foi a causa raiz do problema, embora eu ' adoraria uma confirmação.

Para que conste, minha criação de objeto é bastante simples:

private T CreateProxy(MyArgs args)
    {
        var options = new ProxyGenerationOptions(new MyMethodSelector());
        options.AddMixinInstance(new MyMixin());
        return Generator.CreateClassProxy(
                    TargetType,
                    options,
                    new[] { new MyInterceptor(args) }) as T;
    } 
Foi útil?

Solução

na verdade, o DynamicProxy é thread-safe, portanto é bastante improvável que esteja relacionado à simultaneidade.

Em primeiro lugar, qual versão do DynamicProxy você está usando?

Você consegue reproduzir o problema isoladamente, fora do IIS?

Esse assunto foi relatado há dois anos, mas foi corrigido.Certifique-se de ter a versão mais recente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top