我有一个托管应用程序,必须使用非托管第三方Win32专用DLL从专有文件中读取二进制数据。我保持不常发生的崩溃我的应用程序只是在没有任何异常的情况下退出。在系统中的应用程序日志中,我得到了众所周知的退出代码80131506.在此条目之后,我得到一个“应用程序错误”,其中故障模块是{ {1}}。
在我的托管代码中,我有控件,我添加了大量的调试日志(Thanks,log4net),发现它在这段代码崩溃了:
clr.dll
double* buf = new double[bufSize];
try {
for(SliceIterator iter = numericSlice.begin(); valuesLeft > 0;) {
size_t transferred;
numericSlice.getValuesToArray(iter, buf, bufSize, transferred); // transferred is set to the number of values which were written to the buf array, iter is advanced automatically
valuesLeft -= transferred;
array<double>^ out = gcnew array<double>(transferred);
System::Runtime::InteropServices::Marshal::Copy(IntPtr((void*)buf), out, 0, transferred); // <- crashes here
valueReadCallback(domainId, channelId, out);
}
} finally {
delete buf;
}
和SliceIterator
及其numericSlice
方法来自非托管DLL,我想要完成的是我要拖动getValuesToArray
的内容数组到buf
数组,这是一个托管数组。 out
是valueReadCallback
我进入方法,此代码被称为参数。我必须这样做这很复杂,因为第三方DLL的供应商实现了他自己的引用计数,当我在托管代码中使用它时,它会变得很糟糕。因此,当我做所有令人讨厌的非托管内容时,我必须留在一个范围内,收集所有内容并以某种方式将其发送到管理端,同时仍然在那里。
现在,我的问题是:我这样做了吗? System.Action
是真的做了深层复制还是只是一些“聪明”的重新引用?