【问题标题】:Access method exception with .net reflection.net 反射的访问方法异常
【发布时间】:2014-03-20 12:30:07
【问题描述】:

我正在尝试设置保留未转义字符 %2f 的策略,同时在发送吊床休息请求之前使用 url。正如一些 .net 开发人员可能知道的那样,在尝试在 PUBLIC url 中使用未转义字符时存在编码问题调用linkedin api的字符串。

App.config 作为手机项目是不可能的。

reflection 是其他网站上建议的另一种解决方法,包括这个。

在使用其中一种解决方案时,

      var getSyntaxMethod =
            typeof(UriParser).GetMethod("GetSyntax", BindingFlags.Static | 
              BindingFlags.NonPublic);
        if (getSyntaxMethod == null)
        {
            throw new MissingMethodException("UriParser", new Exception("GetSyntax"));
        }
        var uriParser = getSyntaxMethod.Invoke(null, new object[] { "http" });

        var flagsField =
            uriParser.GetType().BaseType.GetField("m_Flags", BindingFlags.Instance | 
                 BindingFlags.NonPublic);
        if (flagsField == null)
        {
            throw new MissingFieldException("UriParser", new Exception("m_Flags"));
        }
        int oldValue = (int)flagsField.GetValue(uriParser);
        oldValue += 4096;
        flagsField.SetValue(uriParser, oldValue);

我收到以下错误。-

     Additional information: Attempt by method                
     'PhotonWorld.View.LinkedinAuthPage.AddAllowAnyOtherHostFlagToHttpUriParser()' to   
      access method 'System.UriParser.GetSyntax(System.String)' failed

我猜这是特定于手机的。我正在使用 wp8。

其他人有问题吗?

【问题讨论】:

    标签: .net windows-phone-8 linkedin


    【解决方案1】:

    是的,这似乎是由于 silverlight 的限制,包括 windows phone 版本的 silverlight:

    "在 Silverlight 中,您不能使用反射来访问私有类型和成员。如果类型或成员的访问级别会阻止您在静态编译的代码中访问它,则您不能使用反射来动态访问它”。 [MSDN : Security Considerations for Reflection]

    我从this post 测试了演示代码

    var surl = "http://x/y./z";
    
    var url = new Uri(surl);
    Console.WriteLine("Broken: " + url.ToString());
    
    MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
    FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    if (getSyntax != null && flagsField != null)
    {
        foreach (string scheme in new[] { "http", "https" })
        {
            UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme });
            if (parser != null)
            {
                int flagsValue = (int)flagsField.GetValue(parser);
                // Clear the CanonicalizeAsFilePath attribute
                if ((flagsValue & 0x1000000) != 0)
                    flagsField.SetValue(parser, flagsValue & ~0x1000000);
            }
        }
    }
    
    url = new Uri(surl);
    Console.WriteLine("Fixed: " + url.ToString());
    

    在控制台应用程序中运行良好,但抛出异常:

    尝试通过方法 .... 访问方法“System.UriParser.GetSyntax(System.String)”失败

    尝试在 Windows Phone 应用程序(WP7 和 WP8)中调用私有方法时。

    【讨论】:

    • 感谢您的工作...我的项目只是 windows phone 8 sdk,c#,xaml...虽然我猜 Silverlight 代码库用于 windows phone 8 SDK?...那又如何是通过电话开发人员的公共 url 获取链接详细信息的最终解决方案吗?既然所有的门似乎都关上了,还有什么想法吗?
    • 我只是惊讶在 MSDN 中发现了这样的限制并试图证明这一点。是的,windows phone 是基于 sliverlight 的,因此我说 silverlight for windows phone
    • 无论如何,到目前为止我找不到可行的解决方案。这似乎是一个已在标准 .NET 框架中修复的旧错误(var url = new Uri("http://x/y./z"); 产生正确的 url 而没有这些反射在控制台应用程序中有效,但相同的代码会导致在 WP 应用程序中删除点)。我建议在 2 个平台上针对这种不同的行为提出新的问题(或者我稍后再做,我也很好奇)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多