Мы добавили 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;
}