带有.net反射的访问方法异常
我正在尝试设置一个策略,以便在发送吊床rest请求之前使用url时保留未转义字符%2f。正如某些.net开发人员可能知道的那样,在尝试使用公共url字符串中的未转义字符调用linkedin api时,存在编码问题 App.config是不可能的,因为它是一个手机项目 反射是avrious站点上建议的另一种解决方法,包括这一个 在使用其中一种解决方案时带有.net反射的访问方法异常,.net,windows-phone-8,linkedin,.net,Windows Phone 8,Linkedin,我正在尝试设置一个策略,以便在发送吊床rest请求之前使用url时保留未转义字符%2f。正如某些.net开发人员可能知道的那样,在尝试使用公共url字符串中的未转义字符调用linkedin api时,存在编码问题 App.config是不可能的,因为它是一个手机项目 反射是avrious站点上建议的另一种解决方法,包括这一个 在使用其中一种解决方案时 var getSyntaxMethod = typeof(UriParser).GetMethod("GetS
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
其他人有问题吗?是的,这似乎是由于silverlight的限制,包括silverlight for windows phone版本: “在Silverlight中,您不能使用反射来访问私有类型和成员。如果类型或成员的访问级别会阻止您在静态编译代码中访问它,则您不能使用反射动态访问它。”。[] 我测试了演示代码,来自: 这在控制台应用程序中运行良好,但引发异常: 方法
…
尝试访问方法“System.UriParser.GetSyntax(System.String)”失败
当尝试在Windows Phone应用程序(WP7和WP8)中调用私有方法时。感谢您的工作…我的项目只是Windows Phone 8 sdk、c#、xaml…虽然我猜Silverlight代码库用于Windows Phone 8 sdk?…那么,通过公共URL为手机开发人员获取链接详细信息的最终解决方案是什么?既然所有的门都关上了,还有什么想法吗?我只是惊讶地发现MSDN中存在这样的限制,并试图证明这一点。是的,windows phone基于silverlight,因此我声明silverlight适用于windows phone。无论如何,到目前为止,我找不到有效的解决方案。这似乎是一个在标准.NET framework中已修复的旧错误(
var url=new Uri(“http://x/y./z”;
生成正确的url,而不在控制台应用程序中进行反射,但相同的代码会导致在WP应用程序中删除点)。我建议在两个平台上打开一个新的特定于问题的问题,询问这种不同的行为(或者我稍后会做,我也很好奇)。
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());