Почему я получаю исключение отражения "Неверное внутреннее состояние" с помощью Castle DynamicProxy?

Мы добавили DynamicProxy в наше веб-приложение ASP.NET пару недель назад. Код работал нормально в dev и QA, но когда мы перешли в производство, мы получили следующее исключение (только трассировка верха стека):

[ArgumentNullException: Invalid internal state.]

System.Reflection.Emit.TypeBuilder. Модуль модуля) +0 System.Reflection.Emit.TypeBuilder.InternalSetMethodIL(метод Int32Handle, логическое значение isInitLocals, тело Byte[], Byte[] LocalSig, Int32 sigLength, Int32 maxStackSize, Int32, исключение исключений, исключение, исключение, исключение) [] Int32[] rvaFixups, модуль Module) +56 System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() +1033 System.Reflection.Emit.TypeBuilder.CreateType() +99 Castle.DynamicProxy.Generators.Emitters.AbteredTypeTireTyate) +72 Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType() +96 Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateType(имя строки, интерфейсы Type[], INamingScope namingScope) +854 Castle.DynamicProxy.Generators.8 ProxyGenerator.GenerateCode(интерфейсы Type[], параметры ProxyGenerationOptions) +834 Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxyType(тип classToProxy, Type[] AdditionalInterfacesToProxy, параметры ProxyGenerationOptions) +133 Castle.DynamicProxyToxTyProxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Proxy.Port, Параметры ProxyGenerationOptions) +52 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Тип classToProxy, Тип [] AdditionalInterfacesToProxy, Параметры ProxyGenerationOptions, Перехватчики Object[] constructorArguments, Перехватчики IIninterceptor[]). ] AdditionalInterfacesToProxy, параметры ProxyGenerationOptions, перехватчики IInterceptor[]) +48 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Тип параметры ClassToProxy, ProxyGenerationOptions, перехватчики IInterceptor[]) +44

Он работал нормально, когда мы впервые выдвинули код, и сброс IIS исправил его, поэтому я предполагаю, что он связан с потоками, но я не смог найти что-нибудь на веб-страницах относительно лучших практик для генерации прокси-серверов с безопасностью потоков. Предложения?

ОБНОВЛЕНИЕ: Прочитав еще несколько вопросов, особенно здесь, я понял одну потенциальную проблему, а именно то, что я не перезаписал Equals/GetHashCode для реализации написанного мной IProxyGenerationHook, что помешало бы DynamicProxy кэшировать его типы. Поскольку я почти ничего не могу найти в исключении, которое я видел в целом, не говоря уже о том, что связано с DP, я предположу, что причиной отсутствия проблемы была нехватка кэширования типов, вызванная моим упущением, хотя я и был ' буду любить подтверждение.

Для записи, мое создание объекта довольно ванильно:

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;
    } 

1 ответ

Решение

На самом деле DynamicProxy является потокобезопасным, поэтому маловероятно, что он связан с параллелизмом.

Прежде всего, какую версию DynamicProxy вы используете?

Можете ли вы воспроизвести проблему изолированно, вне IIS?

Об этой проблеме сообщили два года назад, но она была исправлена. Пожалуйста, убедитесь, что у вас последняя версия.

Другие вопросы по тегам