Reputation: 33
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
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