WinForms中的TargetInvocationException

时间:2016-11-22 10:25:20

标签: c# winforms

我想在WinForm中调用另一个程序集的方法,就像这样

private void loadToolStripMenuItem_Click(object sender, EventArgs e){
     Thread thread = new Thread(() =>
     {
         string assemblyPath = "PluginForSnake.dll";
         AppDomain domain = AppDomain.CreateDomain("MyNewDomain");
         ObjectHandle handle = domain.CreateInstanceFrom(assemblyPath, "PluginForSnake.Save");
         object obj = handle.Unwrap();
         MessageBox.Show("found");

         if (RemotingServices.IsTransparentProxy(obj)){
            Type type = obj.GetType();
            object[] param = new object[] { _snake, _food };
            MethodInfo saveGame = type.GetMethod("saveGame");
            saveGame.Invoke(obj, param);
         }
      });

      thread.IsBackground = true;
      thread.Start();
}

但是我在Invoke行获得此异常

  

未处理的类型' System.Reflection.TargetInvocationException'发生在mscorlib.dll

1 个答案:

答案 0 :(得分:1)

TargetInvocationException可以解决问题。有几种方法可以让您更轻松。

首先,您可以尝试使用Task,以便更好地处理异常[1]

和/或,您可以创建一个委托[2]并像调用函数一样调用它,而不是调用它。这将为您提供saveGame函数抛出的任何异常,而不是“调用失败”。创建委托的过程也可以揭示您尝试调用的函数的其他问题,并且是一个很好的学习练习。

[1] catch exception that is thrown in different thread

[2] https://msdn.microsoft.com/en-us/library/ms173176.aspx