1

私には2つの非常に単純なメソッドがあり、そのうちの1つは呼び出すことができ、もう1つは例外が見つからない場合に発生します。メソッドは次のとおりです。

class SimClass
    {
        public int GeneralMethod1(int a)
        {
            return a;
        }

        public int GeneralMethod2(Input input)
        {
            return input.Numberi;
        }

    }
    class Input
    {
        public int Numberi { get; set; }
    }

私は単に「GeneralMethod1」を呼び出すことができます:

        Assembly assembly = Assembly.LoadFrom("C:\\Amir\\SimFIle.dll");
        Type type = assembly.GetType("SimFIle.SimClass");
        object instanceOfMyType = Activator.CreateInstance(type);

        object[] Args1 = new object[1]; Args1[0] = -1;
        object result = type.InvokeMember("GeneralMethod1",
              BindingFlags.Default | BindingFlags.InvokeMethod,
                   null,
                   instanceOfMyType,
                   Args1);

しかし、「GeneralMethod2」の呼び出しに問題があります。

    Input input = new Input { Numberi = -5};
    object[] Args2 = new object[1]; Args2[0] = input;
    object output = type.InvokeMember("GeneralMethod2",
          BindingFlags.Default | BindingFlags.InvokeMethod,
               null,
               instanceOfMyType,
               Args2);

私の間違いは何ですか?

4

1 に答える 1

2

問題は、あなたが別のInputクラスを持っていることだと思います。SimFile.dllを動的にロードしていますが、Input静的にインスタンスを作成しています。つまり、Input作成しているクラスは、メソッドを呼び出しているアセンブリ内のクラスと同じではありません。

コード内にすでにへの参照SimFile.dllある場合は、それを明示的にロードしないでください。混乱を招くだけです。プロジェクトにへの参照がない場合SimFile.dllは、おそらく完全に異なるInputタイプのインスタンスを作成しています。

Inputいずれにせよ、動的にロードされたアセンブリ内のクラスを使用することで、問題を修正できるはずです。

Type inputType = assembly.GetType("Input")
object input = Activator.CreateInstance(inputType);
inputType.GetProperty("Numberi").SetValue(input, -5);

// Rest of code as before
于 2012-12-23T15:51:13.437 に答える