3

MSBuild 4.0からのリリースビルドのみを実行すると、「指定されたキャストは無効です」が有効になります。Visual Studio 2012のリリースビルドを使用してこれをテストしましたが、この問題は発生しませんでした。また、MSBuild 4.0のデバッグビルドを使用してこれをテストしましたが、この問題は発生しませんでした。

例外:ここに画像の説明を入力してください

コード

    public abstract class CachedSessionBase : ISessionObject
{
    protected Dictionary<MethodBase, Object> _getAndSetCache = new Dictionary<MethodBase, object>();

    protected TResult SetAndGet<TResult>(ObjectFactory factory, Func<TResult> func)
    {
        StackTrace stackTrace = new StackTrace();
        var methodBase = stackTrace.GetFrame(1).GetMethod();

        if (!_getAndSetCache.ContainsKey(methodBase))
        {
            _getAndSetCache[methodBase] = func.Invoke();
        }

        return (TResult)_getAndSetCache[methodBase];
    }

この行にエラーがスローされています

return (TResult)_getAndSetCache[methodBase];
4

2 に答える 2

6

コール スタックが、期待しているものと異なる可能性があります。メソッドがインライン化されている可能性がありGetFrame(1)、呼び出し元の呼び出し元を取得しています。値がディクショナリから取得されると、別のメソッド用であるため、別の型になります。

メソッドのインライン最適化を防ぐために、属性[MethodImpl(MethodImplOptions.NoInlining]を追加してみてください。SetAndGet

于 2013-01-09T16:57:15.847 に答える