【问题标题】:.NET Compact Framework Reflection call to internal method in .NET framework class.NET Compact Framework 对 .NET 框架类中的内部方法的反射调用
【发布时间】:2011-09-23 19:29:27
【问题描述】:

我正在尝试从 .NET 2.0 CF 应用程序加载 .NET 程序集。我想用三个参数调用一个内部方法,如下所示:

var obj = new System.Web.Security.SqlMembershipProvider();

MethodInfo mi = obj.GetType().GetMethod("GenerateSalt", 
                    BindingFlags.NonPublic | BindingFlags.Instance,
                    null, new Type[] {}, null);

object resObj = mi.Invoke(obj, new object[] {});

执行 GetMethod 调用时,会引发 InvalidProgramException。我可以从常规的 .NET 2.0 控制台应用程序测试工具中进行此调用,但在 .NET 2.0 CF 中它会抛出异常。

发生了什么事?

【问题讨论】:

    标签: reflection compact-framework .net-2.0 invalidprogramexception


    【解决方案1】:

    您不能从 Compact Framework 项目中引用包含 SqlMembershipProvider 的程序集 (System.Web.dll)。据我所知,Compact Framework 中没有这种类型。

    您可能会遇到异常,因为您正在加载包含 Compact Framework 运行时无法理解的 IL 的程序集。

    但是,自己重写 GenerateSalt 的工作相当简单,紧凑的框架应该具备使其工作所需的一切:

    public string GenerateSalt()
    {
        byte[] data = new byte[0x10];
        new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(data);
        return System.Convert.ToBase64String(data);
    }
    

    根本不需要使用 SqlMembershipProvider(或反射)。

    【讨论】:

      【解决方案2】:

      尝试使用 new Type[0] 而不是 new Type[]

      【讨论】:

      • new Type[0]new Type[] {} 之间没有区别(在这种情况下)。
      • 感谢您的建议,但遗憾的是并没有什么不同。
      猜你喜欢
      • 1970-01-01
      • 2020-12-09
      • 2010-11-06
      • 1970-01-01
      • 2011-04-30
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      相关资源
      最近更新 更多