dither
dither

Reputation: 33

c# reflection (or another way to get class values via injected dll)

I've been searching the web for the past 3 weeks trying to get this to work and I'm not having any luck.

A little back story: Injecting a C# .NET 4.0 DLL into a .NET 4.0 application.

(I can get my DLL injected using a bootstrap DLL written in C++ and can call functions in the application)

I can get this code to work but what I am trying to do is get the "actual" values instead of creating a new instance of the class.

Below is a working example of the Reflection working the way I don't want it to work and I'm not sure if reflection is even what I need to be using at this point. Or am I just barking up the wrong tree?

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;
        }
    }
}

Upvotes: 3

Views: 1140

Answers (1)

Hans Passant
Hans Passant

Reputation: 941605

Yes, that code cannot work. You must obtain a reference to the existing instance of the class you are interested in. Creating a new instance doesn't buy you anything but the properties you set on such an instance yourself. Such a reference can be quite difficult to obtain, there is no way to iterate the objects on the garbage collected heap.

Necessarily you need a static variable in the program that tracks the created instances. There's one hint that such a variable may exist, it looks like you are doing something with forms. The Application.OpenForms is a static variable that references a collection of the opened forms. You can iterate it and use GetType() to find an instance of a specific form type. As long as that form object stores a reference to the "TestClass" instance then you can dig it out with Reflection. Also the way that the ManagedSpy++ tool works.

Upvotes: 1

Related Questions