C和x2B之间的System.AccessViolationException封送+;和C# 我有一个第三方的非托管C++ DLL,它被用于托管的C应用程序。我没有访问C++代码的能力。
有两种方法被调用。第一个是同步的,并按预期工作。第二个是异步的,导致出现C和x2B之间的System.AccessViolationException封送+;和C# 我有一个第三方的非托管C++ DLL,它被用于托管的C应用程序。我没有访问C++代码的能力。,c#,c++,marshalling,C#,C++,Marshalling,有两种方法被调用。第一个是同步的,并按预期工作。第二个是异步的,导致出现System.AccessViolationException,这似乎是在执行第二个方法时抛出的,而不是在其他异步行为时抛出的,但我不确定 不幸的是,即使是我控制的C#端,我也无法共享实际代码。有问题的方法签名有一个输入参数,它是一个混合了整数类型(int、uint、ushort)和一些定义为“char*”的指针的对象。另一个正在工作的方法具有类似的签名,只是要填充的输入对象略有不同 这两个非托管方法都将输入参数值打印到日志
System.AccessViolationException
,这似乎是在执行第二个方法时抛出的,而不是在其他异步行为时抛出的,但我不确定
不幸的是,即使是我控制的C#端,我也无法共享实际代码。有问题的方法签名有一个输入参数,它是一个混合了整数类型(int、uint、ushort)和一些定义为“char*”的指针的对象。另一个正在工作的方法具有类似的签名,只是要填充的输入对象略有不同
这两个非托管方法都将输入参数值打印到日志文件中,因此我能够验证封送处理是否正常工作。两个调用的所有输入值在日志中都显示正确。但是,我会注意到,对于char*
字段,只记录指针本身,而不是它所指向的值。我已经验证了由非托管C++代码记录的指针与C语言侧的指针相匹配,但我必须相信它读取的字节数是正确的。每个char*
字段中的字节数在其他输入字段中指定,并且这些字段看起来也正确
对于正在工作的方法调用,C++ DLL在输入参数指示其方法成功完成之后打印附加信息。我不确定第二个方法是否也有这样的输出,我只知道输入参数是异常之前记录的最后一个内容
AccessViolationException
堆栈跟踪中的最后一个条目是:
at System.StubHelpers.ValueClassMarshaler.ClearNative(IntPtr dst, IntPtr pMT)
at MyStuff.MyMethod(String& message) in [path removed]`
MyStuff.MyMethod是一种模糊处理,是我可以控制的实际C#方法调用(因此“路径已删除”)。看起来,当退出C++方法调用时,可能发生异常,而不是在C++方法中,但我不确定。
我找不到任何关于ClearNative
方法的真实文档。我可以猜测这与垃圾收集有关,但我不能确定。我想到这个问题可能与第二个调用错误是异步的,但是异常在我调用C++ DLL的线路中断执行,所以我不确定。
此时,我正在寻找有关ClearNative
的任何信息,这些信息可能有助于我缩小问题的范围,或者任何关于尝试的建议,这些建议可能会为问题提供更多信息