[Help]C#调用DLL接收byte数组的问题。。。

C# code

//C++封装的DLL中传出参数
(CallBack*)(int *pOut);

//C#调用DLL,接收int参数
CallBackFun(ref int outVal);

//========================
这样传值没有问题,
如果我通过DLL传递BYTE数组,不知道该如何封装DLL??????

//准备在C#代码接收参数
CallBackFun2(ref byte[]data);

作者: audiovideo2011   发布时间: 2011-06-16

(CallBack*)(unsigned char* pOut);

作者: healer_kx   发布时间: 2011-06-16

CallBackFun2(byte[]data);

作者: ghost5216   发布时间: 2011-06-16

C# code
//C++中封装DLL
(CallBack*)(Byte* data);


//C#中调用DLL会出异常。。。。。。
CallBackFun2(byte[] data);

作者: audiovideo2011   发布时间: 2011-06-16

byte[]aa=new byte[1000];//分配足够空间
CallBackFun2(aa);

作者: ghost5216   发布时间: 2011-06-16

C# code
// C++ 代码封装DLL
(CallBack*)(unsigned char* pOut);

// C#代码调用DLL
//注册代理函数
RegisterCallBackFunc2(funcTest2);  

//接收消息的函数
private int funcTest2(ref byte data, ref int retVal)
{
//这里会提示系统错误.........
return 0;
}

作者: audiovideo2011   发布时间: 2011-06-16

上面的调用部分写错了
是下面的形式会报系统错误......

C# code
//接收消息的函数
private int funcTest2(ref byte data, ref int retVal)
{
//这里会提示系统错误.........
return 0;
}

作者: audiovideo2011   发布时间: 2011-06-16

不明白楼主意图了 
回调函数可以用委托代替

作者: ghost5216   发布时间: 2011-06-16

引用 7 楼 ghost5216 的回复:
不明白楼主意图了
回调函数可以用委托代替

==================
用C++代码封装DLL来传出BYTE流,

然后在C#中调用这个DLL来接收消息.
有消息到来时,C#中就可以接收到消息...

作者: audiovideo2011   发布时间: 2011-06-16

作者: LOVESONGFOREVER   发布时间: 2011-06-16

C++ C#
=====================================
unsigned char* [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)

不太明白这个是什么意思
[MarshalAs(UnmanagedType.LPArray)]byte[]

作者: audiovideo2011   发布时间: 2011-06-16

RegisterCallBackFunc2
这是啥啊

作者: ghost5216   发布时间: 2011-06-16

引用 11 楼 ghost5216 的回复:
RegisterCallBackFunc2
这是啥啊

==================
这个是用来注册代理函数的啊,在C++中注册这个函数,有数据过来就通知
下面的函数来接收...
funcTest2(ref byte data, ref int retVal)

作者: audiovideo2011   发布时间: 2011-06-16

C#函数这样来接收,也是接收不到数据,
byte[] data只接收到一个元素

private int funcTest2([MarshalAs(UnmanagedType.LPArray)] byte[] data, 
ref int retVal)

作者: audiovideo2011   发布时间: 2011-06-16

但是添加ref关键字编译会有错误...
  private int funcTest2(ref [MarshalAs(UnmanagedType.LPArray)] byte[] data, ref int retVal)

作者: audiovideo2011   发布时间: 2011-06-16

先声明一个和funcTest2相同特种图的委托
RegisterCallBackFunc2 的参数是这个委托

然后调用RegisterCallBackFunc2 的时候用funcTest2作为参数传递

作者: ghost5216   发布时间: 2011-06-16

引用 15 楼 ghost5216 的回复:
先声明一个和funcTest2相同特种图的委托
RegisterCallBackFunc2 的参数是这个委托

然后调用RegisterCallBackFunc2 的时候用funcTest2作为参数传递

==================
是按照这个顺序来弄的,
用下面的代码接收int类型的数据是可以的.
C# code
//C++封装的DLL中传出参数
(CallBack*)(int *pOut);

//C#调用DLL,接收int参数
CallBackFun(ref int outVal);

作者: audiovideo2011   发布时间: 2011-06-16

C# code
C#函数这样来接收,也是接收不到数据,
byte[] data只接收到一个元素
但是加 ref后, 编译会有错误。

private int funcTest2([MarshalAs(UnmanagedType.LPArray)] byte[] data,  
ref int retVal) 


这个参数前面不可以再加  ref了么?

使用指针也接收不到消息,UIntPtr data

作者: audiovideo2011   发布时间: 2011-06-16

把所以原型贴出来看看

作者: ghost5216   发布时间: 2011-06-16