过去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;
}
}
}
答案 0 :(得分:1)
是的,该代码无效。您必须获得对您感兴趣的类的现有实例的引用。创建新实例除了您自己在此类实例上设置的属性外,不会为您购买任何内容。这样的引用可能很难获得,没有办法迭代垃圾收集堆上的对象。
您必须在跟踪创建的实例的程序中需要 static 变量。有一个暗示这样的变量可能存在,看起来你正在用表格做某事。 Application.OpenForms是一个静态变量,它引用已打开表单的集合。您可以迭代它并使用GetType()来查找特定表单类型的实例。只要该表单对象存储对" TestClass"的引用。然后你可以用反射来挖掘它。也是ManagedSpy ++工具的工作方式。