Почему я получаю исключение отражения "Недопустимое внутреннее состояние" с помощью Castle DynamicProxy? - PullRequest
0 голосов
/ 18 февраля 2010

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

[ArgumentNullException: Invalid internal state.]

System.Reflection.Emit. ] rvaFixups, Модуль модуля) +0 System.Reflection.Emit.. Модуль модуль) +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 (имя строки, интерфейсы Type [], INamingScope namingScope) +854 Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode (интерфейсы Type [], параметры ProxyGenerationOptions) +834 Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxyType (Тип classToProxy, Тип [] AdditionalInterfacesToProxy, Опции ProxyGenerationOptions) +133 Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType (тип classToProxy, тип [] AdditionalInterfacesToProxy, параметры ProxyGenerationOptions) +52 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy (Тип classToProxy, Тип [] AdditionalInterfacesToProxy, Опции ProxyGenerationOptions, Объект [] constructorArguments, Перехватчики IInterceptor []) +308 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy (Тип classToProxy, Тип [] 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 Ответ

2 голосов
/ 18 февраля 2010

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

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

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

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

...