想把原来用c#写的代码改用c++来做动态库,并且尽量保持代码的通用性
只在大学里学过c,不过也没必要从头开始看了。
declSpec =declaretion specfication
如何声明导出,可以看vc6.0 msdn ,也可以看下这个博文
http://blog.youkuaiyun.com/chenbuaa/archive/2005/04/22/358205.aspx
上面的文章,也讲了如何导出类,
下面是如何传递数组的问题,下面也是csdn上找来的
extern "C" void arry(byte* lpFirstByte, int arrayLen)
{
//传第一个数的指针进来,后面就可以用lpFirstByte++取得
}
C#中的调用
byte[] bytes = new byte[512];
//初始化bytes
arry(ref bytes[0], bytes.Length);
这个方法是传首地址和长度,多纬的就多个长度 。传出最好也是这样写,不过传出的数组大小最好是事先确定,再把地址给dll
如果数组大小不确定呢?又改如何处理?
只能在c#中先定义一个确定长度的数组,然后把它的地址和各纬长度传进去。
在dll内部如何保存呢?在dll的内部生成一个对应的数组来保存,或者内部不保存,
另外还要注意__stdcall 和extern "c"的问题
2010-5-27 补充
c++的代码在c#中调用,除了上面ref的方法(int* 用ref int代替)外
今天碰到vs2010托管类库中无法用ref int 代替 int*
但是可以用
unsafecode 解决
如下:
unsafe
{
int x, y;
double value;
int* px;
int *py;
double *pvalue;
px =&x;
py =&y;
pvalue =&value;
sharpAI.opencv.imageMatch.matchTemplate(imgaScene, imgaTemplate, "",px, py, pvalue);
}
调用的函数在c++类库中的原型是
static int matchTemplate(imageAgent^ imgaScene,imageAgent^ imgaTemplate,String^ method,int* x,int* y,double* value);
8189

被折叠的 条评论
为什么被折叠?



