日期:2014-05-18  浏览次数:21015 次

C#调用ActiveX控件的参数传递问题byte[]与ref byte
我有一个C++写的ActiveX控件,其中一个导出方法是这样声明的。
C/C++ code

VARIANT_BOOL MyFunc(BYTE* data, LONG size, LONG param1, SHORT param2);


我现在在一个C#程序里使用这个方法(ActiveX控件已经导入并实例化,比如叫axCtrl1),MyFunc自动生成的原型是
C# code
bool MyFunc(ref byte data, int size, int param1, short param2)

我是这样调用的。
C# code

//byte[] data,int size, uint param1, ushort param2已经正常初始化,数据都不会出现溢出。
axCtrl1.MyFunc(ref data[0], size, (int)param1, (short) param2);


上面的调用会导致System.AcessViolationException:尝试读取或写入受保护的内存

MyFunc不会更改data,本身也没有内存泄露。(控件中有调用MyFunc的输出函数工作正常)
我估计是把byte[]强制转换成ref byte时出的问题。请有这方面经验的人来解答一下。



------解决方案--------------------
C# code

//byte[] data,int size, uint param1, ushort param2已经正常初始化,数据都不会出现溢出。
axCtrl1.MyFunc(ref data[0], size, (int)param1, (short) param2);

------解决方案--------------------
C# code
extern static void XXX([MarshalAs(UnmanagedType.LPTStr)]byte[] bb,......

------解决方案--------------------
我用到过楼主的方法,数据类型匹配方式没有问题,会不会是byte数组不够大,导致越界呢?多分配点空间试试吧?
------解决方案--------------------
探讨

我的控件是ocx的,导入的时候VS自动生成了AxInterop.CtrlLib和InterOp.CtrlLib,两个dll,里面已经把原型写死了。

------解决方案--------------------
bool MyFunc(byte[] data, int size, int param1, short param2)