方法 return 后出现 NullReferenceException
NullReferenceException after method return
我在奇怪的地方遇到了一个NullReferenceException
。你可以看到它在图片中的位置:
异常是在 try catch 之外和 return 之后抛出的。 Move
和 MoveResult
数据类型都是结构,不是引用类型。
以下是异常的详细信息:
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 结构后异常已经消失,可以肯定地说这就是发生的情况。
我在奇怪的地方遇到了一个NullReferenceException
。你可以看到它在图片中的位置:
异常是在 try catch 之外和 return 之后抛出的。 Move
和 MoveResult
数据类型都是结构,不是引用类型。
以下是异常的详细信息:
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 结构后异常已经消失,可以肯定地说这就是发生的情况。