//把data中内容拷贝到byte[] newm数组中
private int funcTest2(ref IntPtr data, ref int retVal)
{
//下面两行代码,用开发工具编译运行没有问题
//但是直接运行EXE文件会报错误
byte[] newm = new byte[retVal];
Marshal.Copy(data, newm, 0, retVal);//是不是要通过别的方式来实现内存拷贝???
//GCHandle retPinned = GCHandle.Alloc(ret);
}
private int funcTest2(ref IntPtr data, ref int retVal)
{
//下面两行代码,用开发工具编译运行没有问题
//但是直接运行EXE文件会报错误
byte[] newm = new byte[retVal];
Marshal.Copy(data, newm, 0, retVal);//是不是要通过别的方式来实现内存拷贝???
//GCHandle retPinned = GCHandle.Alloc(ret);
}
参数对应C++原型是unsigned char *&ucData, int *dataLen因为这个函数调用的是C++编写的DLL中的代理函数。
====================
调试时的提示信息如下:托管调试助手“CallbackOnCollectedDelegate”
在“桌面\testDLL\bin\Debug\testDLL.exe”中检测到故障。
其他信息: 对“testDLL!testDLL.Form1+LPONGETMSG2::Invoke”
类型的已垃圾回收委托进行了回调。
这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,
直到确信不会再次调用它们。
//用开发工具编译+运行,是没有问题的
//但是直接运行EXE文件会报错误
byte[] newm = new byte[retVal];
Marshal.Copy(data, newm, 0, retVal);
int t = 1234;
GCHandle h = GCHandle.Alloc(t, GCHandleType.Pinned);
IntPtr p = h.AddrOfPinnedObject();
Marshal.Copy(p, newm, 0, retVal);
参数对应C++原型是unsigned char *&ucData, int *dataLen
感觉你写的有问题 长度是个指针 你不应该直接用指针的值来初始化数组大小byte[] newm = new byte[retVal];你应该先得到大小dataLenprivate int funcTest2(ref IntPtr data, IntPtr retVal)
{
int[] dataLen = new int[1];
Marshal.Copy(retVal, dataLen , 0, 1);//先计算dataLen
byte[] newm = new byte[dataLen[0]];
Marshal.Copy(data, newm, 0, dataLen[0]);
}一点建议
[ 标签:原因,垃圾回收 ] 对“video!MySoftwareStudio.NvsTalk.NvsTalkInterface+M_MessageCallback::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
之前看C++和C#参数类型对照表:
C++中 int*, 在C#中可以用 ref int来接收。
但是也很奇怪,为什么用开发工具编译运行没有问题,
但是直接运行EXE程序就报错误。项目-->属性-->生成-->勾选"允许不安全代码"
也同样有这个"代理函数被回收"的错误。
=======================
项目-->属性-->调试-->勾选"启用非托管代码调试"
调试时的提示信息如下:托管调试助手“CallbackOnCollectedDelegate”
在“桌面\testDLL\bin\Debug\testDLL.exe”中检测到故障。
其他信息: 对“testDLL!testDLL.Form1+LPONGETMSG2::Invoke”
类型的已垃圾回收委托进行了回调。
这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,
托管应用程序必须让这些委托保持活动状态,
直到确信不会再次调用它们。
=======================
项目-->属性-->生成-->配置下拉框选择"Release",有是同样的错误。
{
for (int i = 0; i < len; i++)
desarr[des_index + i] = srcarr[src_index + i];
}