IIS例外.NET 4.0和在私有字段中使用反射

本文关键字:字段 反射 NET 例外 IIS | 更新日期: 2023-09-27 18:05:54

我们在IIS中运行asp.net 4时遇到以下代码问题:

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

.SetValue()调用失败,并出现FieldAccessException(此代码来自公共源代码文件名ADONetHelper.cs,该文件来自名为CompactFormatterPlus的公共源dll)

这似乎只发生在IIS中。

我们认为这是由于反射/代码访问权限(在搜索答案后),但我们还没有找到正确的值集来使此代码工作。

有什么想法吗??谢谢,弗雷德

IIS例外.NET 4.0和在私有字段中使用反射

反映私有成员仅在代码在完全信任下运行时有效。默认情况下,asp.net以中等信任运行。

因此,您需要将您的应用程序配置为以完全信任的方式运行才能正常工作。

如何做到这一点在这篇ASP . net信任级别文章中有解释,但基本上你必须将你的程序集添加到web.config中<securityPolicy>元素下的<fullTrustAssemblies>列表中。

默认情况下,IIS 7.0应用程序以"中等信任"运行。默认情况下,中等信任是禁用ReflectionPermission的。

Medium Trust Summary

对中等信任Web应用程序的主要约束是:…ReflectionPermission不可用。这意味着您不能使用反射。

但看起来像DataTable。CaseSensitive属性有一个getter和一个setter。如果可能的话,我建议你尽量避免反思。例如,当你将来升级到另一个。net框架时,这个私有方法可能会消失,你的应用程序将会崩溃。

如果你正在(反)序列化数据集,也许一个更好的主意是"手动"更改序列化XML中的"caseSensitiveAmbient"部分