0

System.Reflection に問題があります。MethodInfo.Invoke メソッドを呼び出すと、次のような TargetException 例外が発生しました。オブジェクトがターゲットと一致しません。コードは次のとおりです。

object[] parms = new object[] { path };

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Type gameType = null;

foreach (Assembly asm in assemblies)
{
    string asmName = asm.GetName().Name;

    if (asmName == "Tester")
    {
        gameType = asm.GetType("Tester.Main");
        break;
    }
}

var game = Convert.ChangeType(GameInstance, gameType);
Type delegateType = game.GetType().GetEvent("gameVideoLoader").EventHandlerType;

MethodInfo method = delegateType.GetMethod("Invoke");
method.Invoke(game,  parms); // Here the exception

何か案が?PS: ゲーム オブジェクトが正しく割り当てられているため、null ではありません

4

2 に答える 2

2

ジョンが言ったこと。

また、(本番レベルのコードではなく) ハッキングをしようとしている場合は、いくつかの実用的なアドバイスがあります。ソース コードを見て (または、Reflector や dotPeek などの逆アセンブラーを使用して)、イベントがどのように呼び出されるかを確認してください。 .

  • それを呼び出すメソッドがある場合は、リフレクションを使用してそのメソッドを呼び出します
  • それ以外の場合、イベントがコンパイラによって生成されたフィールドを使用している場合は、 を使用Type.GetFieldしてフィールドを取得し (イベントと同じ名前になります)、呼び出しGetValueて実際のデリゲートを取得します。

    • デリゲート型が public の場合、値をキャストして呼び出す

      ((MyDelegate)fieldValue)(arg1, arg2...)

    • Delegateそれ以外の場合は、動的呼び出しメソッドにキャストして使用します

      ((Delegate)fieldValue).DynamicInvoke(new object[] { arg1, arg2 })

于 2013-10-03T07:00:45.260 に答える
1

デリゲートの Invokeメソッドを呼び出そうとしていますが、Tester.Mainインスタンス上です。インスタンスが適切なデリゲートのインスタンスでTester.Mainないためです。

実際にイベントを発生させようとしているのであればgameVideoLoader、それは別の問題です...とにかくやるべきではないことです. イベントの目的は、クライアントがハンドラーをサブスクライブおよびサブスクライブ解除できるようにすることです。オブジェクト自体がイベントの発生を担当する必要があります。イベントの実装に使用される基になるフィールドを見つけ、そのフィールドの値を取得してデリゲートを呼び出すことができる場合がありますが、それはお勧めしません。この時点で、基本的にイベントの設計に反対しています。

于 2013-10-03T05:49:30.023 に答える