体表追踪(摄像机参数设置部分)C#与C++交互

目前完成了摄像机的设置和参数回读显示的功能。拖动滑块调节参数,点击“ok”后会写入到相应参数变量。重新打开设置时,会回读相应参数值,显示出来。
体表追踪(摄像机参数设置部分)C#与C++交互
实现过程中的问题主要出在c#与c++交互(Pinvoke)的时候。由于之前没接触过,所以就很懵,对于怎么交互也没有概念,就大概知道c#会使用c++编译出来的dll,通过一些方法调用其接口,传递数据。
Pinvoke即Platform Invoke,平台调用服务,用于解决c#项目需要调用c++编写的dll的问题。至于他是怎么交互的,我目前只从这个项目的实现去分析,不作深入。


1.先来看c#部分settings.xaml.cs。以下两个部分一个用于设置参数WriteParams,一个用于回读参数Getparams,都是调用了dll的函数。注意APPInterface。
体表追踪(摄像机参数设置部分)C#与C++交互
体表追踪(摄像机参数设置部分)C#与C++交互
2.打开APPInterface.cs,在这里声明了接口函数,[ ]中设置了相应的特性。什么托管不托管的也先不管,先继续看。
体表追踪(摄像机参数设置部分)C#与C++交互
体表追踪(摄像机参数设置部分)C#与C++交互
3.这里抛出第一个问题,在参数设置时,出现了参数错位,参数与实际调节的数值不对应,而是下移了。左图是在.cs中的结构体声明,右图是在.h中声明的结构体。
体表追踪(摄像机参数设置部分)C#与C++交互
其中详细的对应方式先放一边。.cs和.h中对结构体的成员需要有相同的类型名字排列顺序,以这样一种方式去实现对齐匹配,如下图。
体表追踪(摄像机参数设置部分)C#与C++交互
通过调试,C#中bool型通过该编译器编译后所占空间为4个字节,而c++中的bool编译后只占一个字节,所以前面两个参数能对应,因为都是4个字节,知道第三个参数为bool型,后面的都乱了。原本写入Uni的值传给了Med,后面一直错下去。

4.如下图修改代码,添加一个特性来规定bool型占字节数,这样就解决了问题。
体表追踪(摄像机参数设置部分)C#与C++交互
体表追踪(摄像机参数设置部分)C#与C++交互
5.转到c++部分,EnsensoDepth.h中声明了getParams函数。.cpp中实现。
体表追踪(摄像机参数设置部分)C#与C++交互
体表追踪(摄像机参数设置部分)C#与C++交互
在APPInterface.h中声明接口,.cpp实现。
体表追踪(摄像机参数设置部分)C#与C++交互
体表追踪(摄像机参数设置部分)C#与C++交互
6.在写getparam时出现了一些错误。那时我是直接返回一个结构体,其实我也不懂,后面问人说改成传入指针,弄着弄着就行了。

体表追踪(摄像机参数设置部分)C#与C++交互
*7.(1)还有一个就是,更改c++工程之后要先生成,这样才可以编出dll供c#使用,那时候搞了一个下午很懵逼,明明改了跑起来却没有任何变化。。。
(2)刚开始在生成的时候出现一些问题,导致出现如下错误
体表追踪(摄像机参数设置部分)C#与C++交互
在于那时opencv依赖库没有配置好,而由于Ensensolnterop.dll又依赖于那边的.dll,所以会出错,但是它只会报错找不到Ensensolnterop.dll。


1.MarshalAs的使用
2.pinvoke交互
3.方法的类型签名与PInvoke不兼容