7

長いタイトルですが、具体的にしたいと思います。タイトルは本当に質問です。InvokeMember呼び出しているメソッドにはoutパラメーターがあり、そのパラメーターに値を割り当てていますが、その値を取得できません。最初に使用していたコードは次のとおりです。

string parameter = "";
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new object[] { parameter }));

これを変更したため、意図したとおりに機能するようになりましたが、理由はわかりません。

object[] args = new object[1];      //necessary to retrieve ref/out parameter
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, args));
4

3 に答える 3

9

管理されていない (COM) で苦労している (やった) 人を助けて、ref-parameter を取り戻したかっただけです。そのため、COM メソッドに対して InvokeMember を使用する場合、どの引数が ref 型であるかを指定する必要があります。これは、ParameterModifier クラスを使用して実現されます。たとえば、次のようになります。

object[] args = new object[3] { param1, param2, errorStr };
ParameterModifier pMod = new ParameterModifier(3);
pMod[2] = true;            
ParameterModifier[] mods = { pMod };

object tempObj = myCOMObject.GetType().InvokeMember("MyCOMMethod", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public, null, myCOMObject, args, mods, null, null);

上記のコードでは、3 番目の引数が参照になるように設定されています (pMod[2] = true;)。

于 2014-09-24T07:30:25.900 に答える
5

2 番目のスニペットには、かなり重要なコード行がありません。out引数が文字列型であると仮定すると、次のようになります。

object[] args = new object[1];      //necessary to retrieve ref/out parameter
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, 
    BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, 
    null, null, args));
string outValue = (string)args[0];  // <===  here!

最初のスニペットが機能しない理由も明らかなはずです。渡した object[] 配列への参照がないため、変更された引数を取得できません。

于 2012-03-26T23:20:31.773 に答える
3

最初のコード例では、への呼び出しInvokeMemberは変数の値を変更せずparameter、パラメーター配列の最初の項目を置き換えるだけです (現在は別のインスタンスを指していstringます)。この配列への参照を保持していないため、出力パラメーターの値を取得できません。

言い換えると、配列には最初にparameter変数のコピー (つまり、空の文字列への参照のコピー) が含まれます。呼び出しの後、parameter配列内の値は 2 つの異なる文字列インスタンスを参照します。

于 2012-03-26T23:00:01.530 に答える