Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C和x2B之间的System.AccessViolationException封送+;和C# 我有一个第三方的非托管C++ DLL,它被用于托管的C应用程序。我没有访问C++代码的能力。_C#_C++_Marshalling - Fatal编程技术网

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
的任何信息,这些信息可能有助于我缩小问题的范围,或者任何关于尝试的建议,这些建议可能会为问题提供更多信息