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. java一点内容

    1.JAVA有哪些基本数据类型 String是不是基本数据类型 Java语言提供了八种基本类型: 六种数字类型(四个整数型,两个浮点型) 字节型byte 8位 短整型short 16位 整型int 3 ...

  2. C++服务器设计(三):多线程模型设计

    多线程探讨 如今大多数CPU都具有多个核心,为了最大程度的发挥多核处理器的效能,提高服务器的并发性,保证系统对于多线程的支持是十分必要的.我们在之前的设计都是基于单线程而言,在此章我们将对系统进行改进 ...

  3. JavaScript this 局部变量全局变量 作用域 作用域链 闭包

    从阮老师博客的一道测试题说起: 代码段一: var name = "The Window"; var object = { name : "My Object" ...

  4. C# XML序列化帮助类代码

    public static class XmlHelper { private static void XmlSerializeInternal(Stream stream, object o, En ...

  5. Oracle select 中case 的使用以及使用decode替换case

    表结构如下: 将money<50的显示为贫农,money<80的显示为中农,其他的显示为富农,sql 语句如下 select name, case then '贫农' then '中农' ...

  6. poj 3164 Command Network

    http://poj.org/problem?id=3164 第一次做最小树形图,看着别人的博客写,还没弄懂具体的什么意思. #include <cstdio> #include < ...

  7. Android 圆形按钮实现

    项目中用到的圆形按钮,做个半天,用sharp形式实现,样式代码如下: <Button android:id="@+id/btn_5" android:layout_width ...

  8. selenium webdriver使用过程中出现Element is not currently visible and so may not be interacted with的处理方法

    参考文章: http://blog.csdn.net/passionboyxie/article/details/28661107 http://www.spasvo.com/ceshi/open/k ...

  9. bzoj1637 [Usaco2007 Mar]Balanced Lineup

    Description Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的坐标(范围: 0..1,000,000,000 ...

  10. java中的TreeMap如何顺序按照插入顺序排序

    java中的TreeMap如何顺序按照插入顺序排序 你可以使用LinkedHashMap  这个是可以记住插入顺序的. 用LinkedHashMap吧.它内部有一个链表,保持插入的顺序.迭代的时候,也 ...