数週間前に、DynamicProxyをASP.NETWebアプリに追加しました。コードはdevとQAで正常に実行されましたが、本番環境にプッシュすると、次の例外が発生しました(スタックトレースの最上位のみ)。
[ArgumentNullException: Invalid internal state.]
System.Reflection.Emit.TypeBuilder._InternalSetMethodIL(Int32 methodHandle、Boolean isInitLocals、Byte [] body、Byte [] LocalSig、Int32 sigLength、Int32 maxStackSize、Int32 numExceptions、__ExceptionInstance [] exceptions、Int32 [] tokenFixups、Int32 [] rモジュールモジュール)+0 System.Reflection.Emit.TypeBuilder.InternalSetMethodIL(Int32 methodHandle、Boolean isInitLocals、Byte [] body、Byte [] LocalSig、Int32 sigLength、Int32 maxStackSize、Int32 numExceptions、__ExceptionInstance [] exceptions、Int32 [] tokenFixups、 Int32 [] rvaFixups、モジュールモジュール)+56 System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()+1033 System.Reflection.Emit.TypeBuilder.CreateType()+99 Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CreateType(TypeBuilder type )+72Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter。BuildType()+96 Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateType(String name、Type [] interfaces、INamingScopenamingScope)+854 Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode(Type [] interfaces、ProxyGenerationOptions options)+834Castle。 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(Type classToProxy 、Type [] additionalInterfacesToProxy、ProxyGenerationOptionsオプション、Object []コンストラクター引数、IInterceptor []インターセプター)+308 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy、Type [] additionalInterfacesToProxy、ProxyGenerationOptionsオプション、IInterceptor []インターセプター)+48 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy、ProxyGenerationOptionsオプション、IInterceptor []インターセプター)+44
最初にコードをプッシュしたときは正常に機能し、IISリセットで修正されたため、スレッドに関連していると思いますが、スレッドセーフプロキシ生成のベストプラクティスに関してインターウェブ上で何も見つかりませんでした。提案?
更新:この問題についてさらに読んだ後、特にここで、1つの潜在的な問題に気付きました。つまり、作成したIProxyGenerationHookの実装用にEquals / GetHashCodeを上書きしなかったため、DynamicProxyがその型をキャッシュできなくなりました。DPに関連することは言うまでもなく、一般的に見た例外についてはほとんど何も見つからないので、問題の根本的な原因は、私の省略によって引き起こされた型のキャッシュの欠如であったと思いますが、 d確認が大好きです。
記録のために、私のオブジェクトの作成はかなりバニラです:
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;
}