1

asp.net 4 を実行している IIS でホストされている場合、次のコードに問題があります。

        DataTable dt = new DataTable();
        FieldInfo TableCaseSensitiveAmbientFieldInfo =
            typeof(DataTable).GetField("_caseSensitiveUserSet", BindingFlags.Instance | BindingFlags.NonPublic);
        TableCaseSensitiveAmbientFieldInfo.SetValue(dt, true);

.SetValue() 呼び出しは FieldAccessException で失敗します (このコードは、CompactFormatterPlus というパブリック ソース dll から使用されるパブリック ソース コード ファイル名 ADONetHelper.cs からのものです)。

これは、IIS でホストされている場合にのみ発生するようです。

(回答を検索した後) リフレクション/コード アクセス許可が原因であると考えていますが、このコードを機能させるための適切な値のセットが見つかりませんでした。

何かご意見は ??ありがとう、フレッド

4

2 に答える 2

2

プライベート メンバーの反映は、コードが完全な信頼の下で実行されている場合にのみ機能します。デフォルトでは、ASP .NET は中程度の信頼で実行されます。

したがって、これを機能させるには、アプリケーションを完全な信頼で実行するように構成する必要があります。

これを行う方法は、このASP .NET 信頼レベルの記事で説明されていますが、基本的には、web.config の要素<fullTrustAssemblies>の下のリストにアセンブリを追加する必要があります。<securityPolicy>

于 2013-03-26T19:14:35.993 に答える
2

デフォルトでは、IIS 7.0 アプリケーションは「中程度の信頼」で実行されています。また、中程度の信頼では、ReflectionPermission はデフォルトで無効になっています。

中程度の信頼の概要

中程度の信頼の Web アプリケーションに課される主な制約は次のとおりです。 ... ReflectionPermission は使用できません。これは、リフレクションを使用できないことを意味します。

しかし、DataTable.CaseSensitive プロパティにはゲッターとセッターがあるようです。可能な限り内省を避けることをお勧めします。たとえば、将来的に別の .NET フレームワークにアップグレードすると、プライベート メソッドがなくなり、アプリが壊れる可能性があります。

DataSet を (非) シリアル化する場合、シリアル化された XML の「caseSensitiveAmbient」部分を「手動で」変更する方がよいでしょう。

于 2013-03-26T19:11:37.540 に答える