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报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”
一.描述问题 当托管代码调用非托管代码的时候,经常会出现如下报错:“尝试读取或写入受保护的内存.这通常指示其他内存已损坏”. 二.原因分析 由于非托管代码的内存指针的回收是由非托管代码自身手动完成的, ...
随机推荐
- PureLayout(轻量级自动布局)
直接整理用法 1.设置高度宽度 [view1 autoSetDimension:ALDimensionHeight toSize:70.0]; [view1 autoSetDimension:ALDi ...
- 从C到C++的升级
C++的语言类型 C++是静态的强类型语言. 静态语言:数据类型在编译期间检查,因此在写程序时需要声明变量的类型 强类型语言:强调数据类型,不同的数据类型间的转换需要进行强制类型转换 C与C++的关系 ...
- (原+转)ubuntu16中莫名死机及重新安装显卡驱动
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5992693.html 参考网址: http://blog.csdn.net/u012581999/ar ...
- [C++程序设计]用指针变量作函数参数接收数组地址
#include <iostream> using namespace std; void select_sort(int *p, int n) { int i, j, k; ; i &l ...
- [C++程序设计]字符数组的赋值与引用
只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值. char c[5]; c={′C′,′h′,′i′,′n′,′a′}; //错误,不能对整个数组一次赋值 c[0]=′C′; c[1]=′h ...
- NodeJS和C++的性能比较(转)
原文地址: http://www.web-tinker.com/article/20374.html 前段时间做了个实验,测试了1E9次的空循环在NodeJS和C++中的执行用时.于是我和小伙伴们瞬间 ...
- DataSnap
一. DataSnap REST - http://docwiki.embarcadero.com/RADStudio/Berlin/en/DataSnap_REST 1. URI Mapping: ...
- js智能提示代码
<reference path = "../../../Scripts/jQuery-1.4.1.js"/>
- 前端MVVM学习之KnockOut(二)
现在开始学习Knockout并且做个简单的例子. Knockout是建立在以下三个核心功能之上的: 1.Observables and dependency tracking(属性监控与依赖跟踪) 2 ...
- js加载优化三
Javascript性能优化之异步加载和执行 Author:小欧2013-09-17 随着科技的发展,如今的网站和五六年前相比,现在的人们对web的要求越来越高了,用户体验,交互效果,视觉效果等等都有 ...