3

在过去的 3 周里,我一直在网上搜索,试图让它发挥作用,但我没有任何运气。

一点背景故事:将 C# .NET 4.0 DLL 注入 .NET 4.0 应用程序。

(我可以使用用 C++ 编写的引导 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;
        }
    }
}
4

1 回答 1

1

是的,该代码无法正常工作。您必须获得对您​​感兴趣的类的现有实例的引用。创建一个新实例除了您自己在此类实例上设置的属性外,不会给您带来任何好处。这样的引用很难获得,没有办法迭代垃圾收集堆上的对象。

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

于 2012-09-20T11:42:38.833 回答