//把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); 
}

解决方案 »

  1.   

    funcTest2(ref IntPtr data, ref int retVal)  
    参数对应C++原型是unsigned char *&ucData, int *dataLen因为这个函数调用的是C++编写的DLL中的代理函数。
    ====================
    调试时的提示信息如下:托管调试助手“CallbackOnCollectedDelegate”
    在“桌面\testDLL\bin\Debug\testDLL.exe”中检测到故障。
    其他信息: 对“testDLL!testDLL.Form1+LPONGETMSG2::Invoke”
    类型的已垃圾回收委托进行了回调。
    这可能会导致应用程序崩溃、损坏和数据丢失。
    向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态
    直到确信不会再次调用它们。
      

  2.   

    //下面两行代码,
    //用开发工具编译+运行,是没有问题的
    //但是直接运行EXE文件会报错误
    byte[] newm = new byte[retVal];
    Marshal.Copy(data, newm, 0, retVal);
      

  3.   

    byte[] newm = new byte[retVal];
    int t = 1234;
    GCHandle h = GCHandle.Alloc(t, GCHandleType.Pinned);
    IntPtr p = h.AddrOfPinnedObject();
    Marshal.Copy(p, newm, 0, retVal); 
      

  4.   

    funcTest2(ref IntPtr data, ref int 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]);
    }一点建议 
      

  5.   

    什么原因造成:已垃圾回收委托进行了回调。
    [ 标签:原因,垃圾回收 ] 对“video!MySoftwareStudio.NvsTalk.NvsTalkInterface+M_MessageCallback::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 
      

  6.   

    =========================
    之前看C++和C#参数类型对照表:
    C++中 int*, 在C#中可以用 ref int来接收。
      

  7.   

    感觉是回调函数调用有问题,
    但是也很奇怪,为什么用开发工具编译运行没有问题,
    但是直接运行EXE程序就报错误。项目-->属性-->生成-->勾选"允许不安全代码"
    也同样有这个"代理函数被回收"的错误。
    =======================
    项目-->属性-->调试-->勾选"启用非托管代码调试"
    调试时的提示信息如下:托管调试助手“CallbackOnCollectedDelegate”
    在“桌面\testDLL\bin\Debug\testDLL.exe”中检测到故障。
    其他信息: 对“testDLL!testDLL.Form1+LPONGETMSG2::Invoke”
    类型的已垃圾回收委托进行了回调。
    这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,
    托管应用程序必须让这些委托保持活动状态,
    直到确信不会再次调用它们。
    =======================
    项目-->属性-->生成-->配置下拉框选择"Release",有是同样的错误。
      

  8.   

    public static void MemCpy(byte[] desarr, int des_index, byte[] srcarr, int src_index, int len)
            {
                for (int i = 0; i < len; i++)
                    desarr[des_index + i] = srcarr[src_index + i];
            }