我正在尝试使用反射来为 Windows 8 Store App 使用带有 WebView 的代理。问题是,我无法确定 WebView 是否具有用于默认代理的私有方法或私有属性。
我知道android有一种使用反射来更新WebView的方法:WebView android proxy
但是,由于 Android 是开源的,因此更容易看到它在后端使用了哪些方法/对象。
.NET Windows Store API 有什么方法可以做到这一点吗?也许使用反射在运行时加载类。
我正在尝试使用反射来为 Windows 8 Store App 使用带有 WebView 的代理。问题是,我无法确定 WebView 是否具有用于默认代理的私有方法或私有属性。
我知道android有一种使用反射来更新WebView的方法:WebView android proxy
但是,由于 Android 是开源的,因此更容易看到它在后端使用了哪些方法/对象。
.NET Windows Store API 有什么方法可以做到这一点吗?也许使用反射在运行时加载类。
Visual Studio 可以显示一个类中声明的所有成员。将鼠标指针放在 yoru 代码中的类名上方,右键单击该名称,然后选择“Go to defeniton”命令。Visual Studio 将创建一个临时文件并在代码编辑器中打开它。不过,此文件将仅包含成员定义。
甚至可以浏览实现,但 Visual Studio 无法做到这一点。为此,您可以使用反射器工具。我不知道 Reflector 的免费软件模拟,除了ildasm。
您也可以使用代码获取在类中声明的所有成员。Type 类具有GetMembers方法,允许您获取类的所有成员。使用 BindingFlags 指定需要获取私有成员:
MemberInfo[] privateMembers = typeof(MyClass).GetMembers(BindingFlags.Instance | BindingFlags.NotPublic);
使用 Windows 应用商店 API 无法设置绑定标志。但是我确实找到了一种解决方法,您需要创建一个新项目:可移植类库,它针对 .NET 4+ 和 Windows Store API。将此方法放在一个空类中:
public void ReflectionMagic(Object obj)
{
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static;
Type webview_type = obj.GetType();
ConstructorInfo[] constructorinfo_arr = webview_type.GetConstructors(flags);
MemberInfo[] memberinfo_arr = webview_type.GetDefaultMembers();
EventInfo[] eventinfo_arr = webview_type.GetEvents(flags);
FieldInfo[] fieldinfo_arr = webview_type.GetFields(flags);
Type[] interfaces_arr = webview_type.GetInterfaces();
MemberInfo[] membersinfo_arr = webview_type.GetMembers(flags);
MethodInfo[] methodinfo_arr = webview_type.GetMethods(flags);
Type[] nestedtypes_arr = webview_type.GetNestedTypes(flags);
PropertyInfo[] propertyinfo_arr = webview_type.GetProperties(flags);
Type webview_interface_type = obj.GetType().GetInterfaces()[5].GetType();
ConstructorInfo[] constructorinfo_arr2 = webview_interface_type.GetConstructors(flags);
MemberInfo[] memberinfo_arr2 = webview_interface_type.GetDefaultMembers();
EventInfo[] eventinfo_arr2 = webview_interface_type.GetEvents(flags);
FieldInfo[] fieldinfo_arr2 = webview_interface_type.GetFields(flags);
Type[] interfaces_arr2 = webview_interface_type.GetInterfaces();
MemberInfo[] membersinfo_arr2 = webview_interface_type.GetMembers(flags);
MethodInfo[] methodinfo_arr2 = webview_interface_type.GetMethods(flags);
Type[] nestedtypes_arr2 = webview_interface_type.GetNestedTypes(flags);
PropertyInfo[] propertyinfo_arr2 = webview_interface_type.GetProperties(flags);
}
从您的原始项目中,添加对此可移植类库的引用,实例化该类并使用您想要的对象调用方法:ReflectionMagic。
您应该能够通过单步执行调用 ReflectionMagic 的代码行来单步执行可移植类库代码。(提示:F11 - 进入)
注意:Visual Studio 2012 Express 无法创建可移植类库。我使用了 Visual Studio 2012 Ultimate 的试用版