2011-08-02 7 views
17

私のお手伝いをしてください - なぜこのコードは.NET 4.0で動作するとVerificationExceptionを引き起こしますか?.NET 4で実行している場合、なぜこの行がVerificationExceptionを引き起こしますか?

public T parseEnum<T>(string value, T defaultValue) { 
    //Removing the following lines fixes the problem 
    if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type"); 
    return defaultValue; 
} 

私は、.NET 2.0のアセンブリにpeverifyを実行し、次のメッセージだ:

ImageResizer.Util.Utilsを:: parseEnumに[T]] [] 0x0000000Aがオフセット 'この' パラメータ呼び出しは呼び出し側メソッドの 'this'パラメータでなければなりません。

これにより、中信頼のコードを実行すると、VerificationException: Operation could destabilize the runtimeというメッセージが表示されます。

私はすでに類似した投稿をすべてスタックオーバーフローで読みましたが、このコードには該当しません。

このコードが何らかの形で無効になるようなジェネリックの新機能がありますか?

+0

このコードを実行しただけで、そのような例外は発生しませんでした。エラーがどこにあるのは確かですか?これはASPで使用されていますか? –

+0

Visual Studioや他のコンパイラ(Monoなど)を使用して.NETアセンブリを生成していますか? – Jacob

+1

このエラーメッセージは、この問題が発生しているコールサイト(つまり、メソッドを呼び出している場所)にあることを示しています。そのコードも表示できますか? –

答えて

31

エラーの根本原因は、IsEnumのシグネチャの変更です。

.NET 2.0で

(3.0)、IsEnum wasn't a virtual method

public bool IsEnum { get; } 

それを呼び出すために放出されたアセンブリである:.NET 4.0、IsEnum is a virtual method

call instance bool [mscorlib]System.Type::get_IsEnum() 

public virtual bool IsEnum { get; } 

ここでは4.0の同じアセンブリラインがあります:

callvirt instance bool [mscorlib]System.Type::get_IsEnum() 

エラーはadded in peverify just before the 2.0 releaseでした。仮想メソッドが非仮想的に呼び出されたときに警告が表示されます。

今、peverifyはコードを読み込み、.NET 4.0を読み込み、コードをチェックします。あなたのコードは(仮想的な).NETメソッドを仮想的に呼び出すので、エラーが表示されます。

あなたは.NET 2.0バージョンに対してビルドしているので、これはうまくいくはずで、チェックするには.NET 2.0 CLRがロードされます。そうは思われません。

編集:

これをチェックするために、私は.NET 2.0's SDKをダウンロードし、そこにpeverifyを試してみました。コードを正しく検証します。

メッセージは次のようになります。コードのターゲットフレームワークに一致するpeverifyを使用します。

ソリューション:

_Type interfaceはこれを解決する方法を提供しているようです:

if (((_Type)typeof(T)).IsEnum) ... 

ドキュメントは、アンマネージコードから呼び出されるように設計されたと言うが、それの副作用としてインターフェイスであるため、安定した(仮想の)呼び出し方法を提供します。

peverifyを対象にして2.0または4.0を対象としていることを確認しました。

+4

すばらしい答え!私はこのようなことを学ぶのが大好きです。 –

+0

ありがとう - それは意味をなさない。私のアセンブリは.NET 2.0と.NET 4.0の両方のフレームワークをターゲットにしているので、私は単にIsEnumを呼び出すことはできないと思いますか? –

+1

実際には、バージョンに依存しないという_Typeインタフェースがあります。このような問題を回避するように設計されている可能性があります。私はそれを答えに加えます。 – porges

関連する問題