3

私はこれを機能させるために過去3週間ウェブを検索してきましたが、運がありません。

ちょっとした裏話:C#.NET4.0DLLを.NET4.0アプリケーションに挿入します。

(C ++で記述されたブートストラップDLLを使用してDLLを挿入し、アプリケーションで関数を呼び出すことができます)

このコードを機能させることはできますが、私がやろうとしているのは、クラスの新しいインスタンスを作成する代わりに、「実際の」値を取得することです。

以下は、Reflectionが機能したくない方法で機能している例です。この時点で、Reflectionが使用する必要があるものであるかどうかはわかりません。それとも私は間違った木を吠えているだけですか?

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

はい、そのコードは機能しません。関心のあるクラスの既存のインスタンスへの参照を取得する必要があります。新しいインスタンスを作成しても、そのようなインスタンスに設定したプロパティ以外は購入しません。このような参照を取得するのは非常に難しい場合があり、ガベージコレクションされたヒープ上のオブジェクトを反復処理する方法はありません。

必然的に、作成されたインスタンスを追跡するプログラムに静的変数が必要です。そのような変数が存在する可能性があるという1つのヒントがあります。それは、フォームで何かをしているように見えます。Application.OpenFormsは、開いたフォームのコレクションを参照する静的変数です。それを繰り返し、GetType()を使用して特定のフォームタイプのインスタンスを見つけることができます。そのフォームオブジェクトが「TestClass」インスタンスへの参照を格納している限り、Reflectionを使用してそれを掘り下げることができます。また、ManagedSpy++ツールの動作方法。

于 2012-09-20T11:42:38.833 に答える