c#reflection(或通过注入dll获取类值的另一种方法)

时间:2012-09-20 05:08:21

标签: c# dll code-injection

过去3周我一直在寻找网络,试图让这个工作起来,我没有运气。

一个小故事:将C#.NET 4.0 DLL注入.NET 4.0应用程序。

(我可以使用用C ++编写的bootstrap DLL注入我的DLL并可以在应用程序中调用函数)

我可以使用此代码,但我想要做的是获取“实际”值而不是创建类的新实例。

下面是一个反映工作的工作示例,我不希望它工作,我不确定反射是否是我需要在此时使用的。或者我只是在咆哮错误的树?

namespace TestFormsApp4
{
    static class Program
    {
        private static TestClass1 Test = new TestClass1("from class 1");
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            BindingFlags Binding = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
            Assembly App = Assembly.Load("TestFormsApp4");
            //Get the TestFormsApp4.Program (static) type
            Type Test1C = App.GetType("TestFormsApp4.Program");
            //get the testclass2 field (TestClass2 testclass2;)
            var Test1F = Test1C.GetField("Test", Binding);
            //get the value from the field
            var Test2C = Test1F.GetValue(Test1C);

            Application.Run(new Form1());
        }
    }
}

namespace TestName1
{                      
    class TestClass1
    {
        public bool testbool = false;
        public TestClass2 testclass2;
        public TestClass1(String SetString)
        {
            this.testclass2 = new TestClass2(SetString);
        }
    }
}

namespace TestName2
{
    class TestClass2
    {
        public String teststring;
        public TestClass2(String SetString)
        {
            teststring = SetString;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

是的,该代码无效。您必须获得对您​​感兴趣的类的现有实例的引用。创建新实例除了您自己在此类实例上设置的属性外,不会为您购买任何内容。这样的引用可能很难获得,没有办法迭代垃圾收集堆上的对象。

您必须在跟踪创建的实例的程序中需要 static 变量。有一个暗示这样的变量可能存在,看起来你正在用表格做某事。 Application.OpenForms是一个静态变量,它引用已打开表单的集合。您可以迭代它并使用GetType()来查找特定表单类型的实例。只要该表单对象存储对" TestClass"的引用。然后你可以用反射来挖掘它。也是ManagedSpy ++工具的工作方式。