简介

有的时候调用别人.NET的dll,又想访问别人类里的私有字段或者属性,但是奈何dll里代码改不得,如何强制访问?其实方法也是有的

这里利用c#的反射库就可以轻松做到,下面放出代码

PS:不知道字段属性的区别的,去百度一下

0x01 读写私有字段的值

public static T GetPrivateField<T>(this object instance, string fieldname)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    FieldInfo field = type.GetField(fieldname, flag);
    return (T)field.GetValue(instance);
}
public static void SetPrivateField(this object instance, string fieldname, object value)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    FieldInfo field = type.GetField(fieldname, flag);
    field.SetValue(instance, value);
}

0x02 读写私有属性的值

public static T GetPrivateProperty<T>(this object instance, string propertyname)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    PropertyInfo field = type.GetProperty(propertyname, flag);
    return (T)field.GetValue(instance, null);
}
public static void SetPrivateProperty(this object instance, string propertyname, object value)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    PropertyInfo field = type.GetProperty(propertyname, flag);
    field.SetValue(instance, value, null);
}

0x03 调用私有方法

public static T CallPrivateMethod<T>(this object instance, string name, params object[] param)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    MethodInfo method = type.GetMethod(name, flag);
    return (T)method.Invoke(instance, param);
}

0x04 测试

dll代码

public class TestClass
{

    public TestClass()
    {
        privatefield1 = 1;
        privatefield2 = 99;
        PrivateFieldA = "Lo";
        PrivateFieldB = "ve";
    }

    private int privatefield1;
    private int privatefield2;
  

    private string PrivateFieldA
    {
        get;
        set;
    }
    private string PrivateFieldB
    {
        get;
        set;
    }


    private int Add()
    {
        return privatefield1 + privatefield2;
    }
    private string Join()
    {
        return PrivateFieldA + PrivateFieldB;
    }
}

调用代码

TestClass obj = new TestClass();
System.Console.WriteLine("私有字段");
System.Console.WriteLine(obj.GetPrivateField<int>("privatefield1"));
System.Console.WriteLine(obj.GetPrivateField<int>("privatefield2"));

System.Console.WriteLine("私有属性");
System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldA"));
System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldB"));

System.Console.WriteLine("私有方法");
System.Console.WriteLine(obj.CallPrivateMethod<int>("Add",null));
System.Console.WriteLine(obj.CallPrivateMethod<string>("Join", null));

System.Console.WriteLine("修改私有属性");
obj.SetPrivateProperty("PrivateFieldA", "hello");
obj.SetPrivateProperty("PrivateFieldB", "world");
System.Console.WriteLine(obj.CallPrivateMethod<string>("Join", null));
System.Console.Read();