方法 return 后出现 NullReferenceException

NullReferenceException after method return

我在奇怪的地方遇到了一个NullReferenceException。你可以看到它在图片中的位置:

异常是在 try catch 之外和 return 之后抛出的。 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);

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

定义的

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

这可能会导致调用时堆栈损坏。这种损坏的症状可能包括:

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

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