【问题标题】:Access to private method using reflection in C#/Silverlight applications在 C#/Silverlight 应用程序中使用反射访问私有方法
【发布时间】:2011-09-01 22:07:19
【问题描述】:

我的代码使用反射调用方法:

        scoringType.InvokeMember("scoringClient_ScorePostsCompleted",
            BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
            null, scoringInstance,
            new object[] { sArg, eArg });

其中scoringInstance 是ModelView 类的一个实例。该方法是私有的,但我使用 BindingFlags.NonPublic,所以,我应该能够访问它,但我不能 - 我得到 MethodAccessException 异常:“尝试通过方法......访问方法......失败。” 谷歌似乎没有答案。你知道如何解决它吗?

【问题讨论】:

  • 查看 ReflectionPermission 类。

标签: c# silverlight reflection


【解决方案1】:

来自 Silverlight 上的 MSDN

在 Silverlight 中,您不能使用反射来访问私有类型和 成员。如果某个类型或成员的访问级别会阻止您 从静态编译的代码中访问它,您无法访问它 使用反射动态地。

编辑:

Silverlight 5 现在只允许反射私有成员,前提是您在浏览器外或浏览器内以提升的权限运行(在浏览器内使用生成的测试页不起作用)。

【讨论】:

  • 谢谢!你为我节省了数小时的失败尝试:)
  • @MerickOWA,有什么解决方法吗?有什么方法可以信任我的应用程序? Reflection.Emit?
  • @Shimmy 我做了更多的测试,唯一的解决方法是在浏览器内或浏览器外使用具有提升权限的 Silverlight 5。 Silverlight 4 提升的权限不允许反射。自 Silverlight 5 发布以来,我将更新答案以反映这一点。
  • 我在 SL 5。我将对提升的信任进行研究。
  • 仅供参考,在 Mac OSX 上获取具有提升权限的私人成员的能力是错误​​的。我不得不解决叶类中的代码可以访问私有成员但叶的父级中完全相同的代码不能......这很奇怪。
【解决方案2】:

如果您需要访问非公共成员,您可以使用 LambdaExpression 来实现。 我写了这个article,详细解释了它的工作原理。

【讨论】:

  • LamdaExpression 不适用于标有 SecuritySafeCriticalAttribute 的 SL 5 .NET 内部方法。您是否测试过您的解决方案?
  • 不幸的是,此解决方案也不适用于具有SecuritySafeCriticalAttribute 属性的内部方法。
猜你喜欢
  • 2010-10-26
  • 2022-11-27
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 2012-01-23
  • 2017-11-10
相关资源
最近更新 更多