C# 调用c++报错可能性分析
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++报错可能性分析的更多相关文章
- php调用webservice报错Class 'SoapClient' not found
原文:php调用webservice报错Class 'SoapClient' not found php在调用webservice时,报告如下类似错误: ( ! ) Fatal error: Clas ...
- 【jvm】linux 调用 jmap 报错Permission denied
linux 调用 jmap 报错Permission denied 解决方案: 分别对java安装目录,java的bin目录以及jmap命令设置权限 chmod jdk1..0_79 chmod b ...
- Quartz框架调用——运行报错:ThreadPool class not specified
Quartz框架调用——运行报错:ThreadPool class not specified 问题是在于Quartz框架在加载的时候找不到quartz.properties配置文件: 解决方案一: ...
- Unity 3D 使用TerrainCompose 调用RTP 报错:
Unity 3D:5.2 version TerrainCompose:1.92 version RTP:3.2d version Unity 3D 使用TerrainCompose 调用RTP 报 ...
- Mybatis调用存储过程报错
Mybatis调用存储过程 贴码 123456 Error querying database. Cause: java.sql.SQLException: User does not have ac ...
- @Autowired报错原因分析和4种解决方案!
上图的报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正常执行,也就是虽然编译器 IDEA 报错,但程序却能正常的执行,那这其中的原因又是为何? 报错原因分析 报错的原因 ...
- NPOI EXECL数据导入,日期格式调用DateCellValue取值时,二次或后续调用出现报错!
NPOI version:2.5.1 EXCEL数据导入功能,第一次调用DateCellValue获得日期值OK,二次或后续调用出现报错"函数求值需要运行所有线程" 初步怀疑是版本 ...
- Python使用suds调用webservice报错解决方法:AttributeError: 'Document' object has no attribute 'set'
使用python的suds包调用webservice服务接口,报错:AttributeError: 'Document' object has no attribute 'set' 调用服务接口代码: ...
- C# 调用OpenCVSharp报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”
一.描述问题 当托管代码调用非托管代码的时候,经常会出现如下报错:“尝试读取或写入受保护的内存.这通常指示其他内存已损坏”. 二.原因分析 由于非托管代码的内存指针的回收是由非托管代码自身手动完成的, ...
随机推荐
- java一点内容
1.JAVA有哪些基本数据类型 String是不是基本数据类型 Java语言提供了八种基本类型: 六种数字类型(四个整数型,两个浮点型) 字节型byte 8位 短整型short 16位 整型int 3 ...
- C++服务器设计(三):多线程模型设计
多线程探讨 如今大多数CPU都具有多个核心,为了最大程度的发挥多核处理器的效能,提高服务器的并发性,保证系统对于多线程的支持是十分必要的.我们在之前的设计都是基于单线程而言,在此章我们将对系统进行改进 ...
- JavaScript this 局部变量全局变量 作用域 作用域链 闭包
从阮老师博客的一道测试题说起: 代码段一: var name = "The Window"; var object = { name : "My Object" ...
- C# XML序列化帮助类代码
public static class XmlHelper { private static void XmlSerializeInternal(Stream stream, object o, En ...
- Oracle select 中case 的使用以及使用decode替换case
表结构如下: 将money<50的显示为贫农,money<80的显示为中农,其他的显示为富农,sql 语句如下 select name, case then '贫农' then '中农' ...
- poj 3164 Command Network
http://poj.org/problem?id=3164 第一次做最小树形图,看着别人的博客写,还没弄懂具体的什么意思. #include <cstdio> #include < ...
- Android 圆形按钮实现
项目中用到的圆形按钮,做个半天,用sharp形式实现,样式代码如下: <Button android:id="@+id/btn_5" android:layout_width ...
- 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 ...
- bzoj1637 [Usaco2007 Mar]Balanced Lineup
Description Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的坐标(范围: 0..1,000,000,000 ...
- java中的TreeMap如何顺序按照插入顺序排序
java中的TreeMap如何顺序按照插入顺序排序 你可以使用LinkedHashMap 这个是可以记住插入顺序的. 用LinkedHashMap吧.它内部有一个链表,保持插入的顺序.迭代的时候,也 ...