1.在调用之前,可以用工具(Dependency)检测下c++库所依赖的文件,看是否有错误。如果有错误,请先下补充所需运行环境。

2.如果c++ 函数 形参需要C#传入结构体,可如下:

 [StructLayout(LayoutKind.Sequential)]//作用:按顺序排列,防止C#编译器打乱,起到与C++那边保持一致。
public struct mwEdgeFileHeader
{
uint type; //切面数据文件头类型固定为0xFF0000F1
uint version; //初始版本为1,更改后依次提升
uint length; //头信息的长度,字节为单位,此为20
uint content_offset; //存储的数据起始在文件中的偏移量,此为20+1
uint content_length; //存储的数据长度
};

如果 上面结构体中有数组,C#定义结构体,必须指明结构体的长度。注意:c++端必须指明数组长度,不可使用动态长度(目前我测试的时候是这样子,可能不全,希望有遇到能动态的朋友,私信我,大家一起探讨下,谢谢!)

c++代码:

 typedef struct _edgefile{
char name[]; //此数据对应图像文件的名字
uint32_t width; //图像的宽度
uint32_t height; //图像的高度
double center_x; //瞳孔X轴方向位置
double center_y; //瞳孔Y轴方向位置
double pupils_dia; //瞳孔的直径
double coef[]; //侧面图像校正矩阵
double ratio[]; //侧面图像和正面图像的像素长
uint32_t info_count; //所包含的边缘信息的数量
}mwEdgeContents;

C#转换代码:

     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct mwEdgeContents
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public char[] name; //此数据对应图像文件的名字
public UInt32 width; //图像的宽度
public UInt32 height; //图像的高度
public double center_x; //瞳孔X轴方向位置
public double center_y; //瞳孔Y轴方向位置
public double pupils_dia; //瞳孔的直径
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public double[] coef; //侧面图像校正矩阵
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public double[] ratio; //侧面图像和正面图像的像素长
public UInt32 info_count; //所包含的边缘信息的数量
};

3.如果c++ 函数 返回值是结构体指针,C# 请用intptr接收,然后C#再把intptr转结构体,如下:

C#翻译的结构体:

  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct MwEdges
{
UInt32 count;
UInt32 lenght;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
double[] p11;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
double[] p12;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
double[] p21;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
double[] p22;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
double[] p31;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
double[] p32;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
double[] p41;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
double[] p42;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
double[] p51;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
double[] p52;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
Point[] poiAngle;
double dAngle;
};

C#调用该结构体:

   string filename = (Directory.GetCurrentDirectory() + "\\20140707143436\\result\\" + "flank01L.edg");
MwEdges picCfg = new MwEdges();
int size = Marshal.SizeOf(picCfg);
byte[] bPicCfg = new byte[size]; //即调用某个函数从C++的Dll获取到结构体的bPicCfg,如果这个函数调用失败或者不调用,则不会出现问题。
IntPtr ipPicCfg = Marshal.AllocHGlobal(size);
Marshal.Copy(bPicCfg, , ipPicCfg, bPicCfg.Length); //问题出现在这里。运行时报 引发类型为“System.ExecutionEngineException”的异常。 这个错误。
IntPtr data = ReadEdgeDatas(filename);
picCfg = (MwEdges)Marshal.PtrToStructure(data, picCfg.GetType());

文章写的有点乱,但主要目的还是为了解决C#调用c++库问题,如果文章还是没有看懂的,请各位朋友自行下载源代码,调试看看。

http://files.cnblogs.com/ltlly/testCSharpUseC.rar

C# 调用c++报错可能性分析的更多相关文章

  1. php调用webservice报错Class 'SoapClient' not found

    原文:php调用webservice报错Class 'SoapClient' not found php在调用webservice时,报告如下类似错误: ( ! ) Fatal error: Clas ...

  2. 【jvm】linux 调用 jmap 报错Permission denied

    linux 调用 jmap  报错Permission denied 解决方案: 分别对java安装目录,java的bin目录以及jmap命令设置权限 chmod jdk1..0_79 chmod b ...

  3. Quartz框架调用——运行报错:ThreadPool class not specified

    Quartz框架调用——运行报错:ThreadPool class not specified 问题是在于Quartz框架在加载的时候找不到quartz.properties配置文件: 解决方案一: ...

  4. Unity 3D 使用TerrainCompose 调用RTP 报错:

    Unity 3D:5.2 version TerrainCompose:1.92 version RTP:3.2d version Unity 3D  使用TerrainCompose 调用RTP 报 ...

  5. Mybatis调用存储过程报错

    Mybatis调用存储过程 贴码 123456 Error querying database. Cause: java.sql.SQLException: User does not have ac ...

  6. @Autowired报错原因分析和4种解决方案!

    上图的报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正常执行,也就是虽然编译器 IDEA 报错,但程序却能正常的执行,那这其中的原因又是为何? ​ 报错原因分析 报错的原因 ...

  7. NPOI EXECL数据导入,日期格式调用DateCellValue取值时,二次或后续调用出现报错!

    NPOI version:2.5.1 EXCEL数据导入功能,第一次调用DateCellValue获得日期值OK,二次或后续调用出现报错"函数求值需要运行所有线程" 初步怀疑是版本 ...

  8. Python使用suds调用webservice报错解决方法:AttributeError: 'Document' object has no attribute 'set'

    使用python的suds包调用webservice服务接口,报错:AttributeError: 'Document' object has no attribute 'set' 调用服务接口代码: ...

  9. C# 调用OpenCVSharp报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”

    一.描述问题 当托管代码调用非托管代码的时候,经常会出现如下报错:“尝试读取或写入受保护的内存.这通常指示其他内存已损坏”. 二.原因分析 由于非托管代码的内存指针的回收是由非托管代码自身手动完成的, ...

随机推荐

  1. poj1201/zoj1508/hdu1384 Intervals(差分约束)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Intervals Time Limit: 10 Seconds      Mem ...

  2. vim 折叠技巧

    转自:http://www.2cto.com/os/201203/122133.html 主要命令: zf-创建折叠 zf20G--创建折叠,从当前行折叠到第20行 zfgg--创建折叠,从当前位置折 ...

  3. C++ Primer Plus 6th 读书笔记 - 第6章 分支语句和逻辑运算符

    1. cin读取错误时对换行符的处理 #include <iostream> using namespace std; int main() { double d; char c; cin ...

  4. 解决方案:elipse一直loading descriptor for...

    1,问题描述: 打开eclipse,一直在loading descriptor for...,eclipse假死,什么操作都做不了 2,环境描述: Java Compiler:1.8 Jdk :1.8 ...

  5. 指令中 controller && controllerAs

    1, controller 他会暴露一个API,利用这个API可以在多个指令之间通过依赖注入进行通信. controller($scope, $element, $attrs, $tranclude) ...

  6. python-整理-vs2013新建文件编码

    使用VS2013新建py包和py空文件还有文本文件时发现编码是936.如果代码中写了中文关闭后再打开就乱码了. 找了几个小时,发现模板文件就是936编码,奇怪的是pyclass等其它模板是正常的UTF ...

  7. Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

    1,引言 在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor.本文记录了确定gsExtractor的技术路线过程中所做的编程实验.这是第二部分,第一 ...

  8. poj 1177 picture

    题目链接:http://poj.org/problem?id=1177 分析:这道题主要用到了线段树.扫描线以及离散化的相关算法. 离散化 离散化是当数字不多但是范围很大时采用的一种方法,将大区间的数 ...

  9. FatMouse's Speed(HDU LIS)

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  10. Sunscreen(POJ 3614 优先队列)

    Sunscreen Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5898   Accepted: 2068 Descrip ...