方法返回后的NullReferenceException

时间:2016-12-03 11:09:50

标签: c# .net nullreferenceexception

我在奇数位置遇到NullReferenceException。你可以看到它在图片中的位置:

Picture

在try catch之外和返回之后抛出了异常。 MoveMoveResult数据类型都是结构,不是引用类型。

以下是例外情况的详细信息:

System.NullReferenceException was unhandled
      Message=Object reference not set to an instance of an object.
      Source=MatinChess.Net
      StackTrace:
           at MatinChess.Net.MatinChess.MovePiece(Move move) in C:\Users\Matin\Documents\GitHub\MatinChessDLL\dotnet\MatinChess.Net\MatinChess.cs:line 37
           at MatinChess.Net.Demo.Program.Main(String[] args) in C:\Users\Matin\Documents\GitHub\MatinChessDLL\dotnet\MatinChess.Net.Demo\Program.cs:line 31
           at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Threading.ThreadHelper.ThreadStart()
      InnerException:

我在Visual Studio 2015社区版上使用.NET Framework 2.0。

修改

当我评论ExternMethods.MovePiece行时,它不会抛出异常。

以下是此方法的定义:

[DllImport(dll, CallingConvention = CallingConvention.Cdecl)]
public extern static void MovePiece(Move movement, ref MoveResult result);

1 个答案:

答案 0 :(得分:0)

您已经编辑了一个重要线索:被调用的方法,以某种方式引发此异常的方法,是使用[DllImport(...)]定义的。

由于在调用此外部函数的方法结束时抛出异常,因此很可能C#中指定的签名与编译到此dll中的函数的签名不匹配。

这可能会导致堆栈在您调用时损坏。此类腐败的症状可能包括:

  • 方法调用返回时的奇数异常
  • 方法调用返回
  • 后的奇数异常
  • 数据损坏,如堆栈变量被覆盖等等。

由于您现在已经确认在更改MoveResult结构后,异常已经消失,因此可以肯定地说这就是发生的事情。