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报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”
一.描述问题 当托管代码调用非托管代码的时候,经常会出现如下报错:“尝试读取或写入受保护的内存.这通常指示其他内存已损坏”. 二.原因分析 由于非托管代码的内存指针的回收是由非托管代码自身手动完成的, ...
随机推荐
- iOS 之改变状态栏颜色
1.在工程中找到 info.plist 文件,点击“+”号,选择 View controller-based status bar appearance 并设为 NO 2.在 AppDelegate ...
- WCF入门教程系列一
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- pp to write
vanishing gradient problem multi-dimensional lstm
- (原)Windows下编译指纹识别的Rel_4.1.0库
网址:http://www.cnblogs.com/darkknightzh/p/4867372.html.未经允许,严禁转载. 没怎么用过linux,对于MSYS和MinGW也基本没用过,因而编译R ...
- 从Ecipse中导出程序至apk
若未有数字证书: 1. 2. 3. 4. 5. 若已有数字证书: 上面的后3步改为
- 关于Android Assets读取文件为File对象
关于Android Assets读取文件为File对象的问题,在Assets里面放置文件,在使用的时候,一般是使用AssetManger对象,open方法获取InputStream 然后进行其他操作. ...
- 【Ecstore2.0】第三方信任登陆问题解决_备忘
ECSTORE2.0的信任登陆模块开启后,需要拿着授过权的ID在官网进行配置才可以使用,但是客户的授权证书一时无法使用,而跳过认证的话功能又用不了,所以就自己临时搭了一个测试用的认证服务器和信任登陆平 ...
- 网关协议学习:CGI、FastCGI、WSGI、uWSGI
一直对这四者的概念和区别很模糊,现在就特意梳理一下它们的关系与区别. CGI CGI即通用网关接口(Common Gateway Interface),是外部应用程序(CGI程序)与Web服务器之间的 ...
- BC 65 game
主持人一直某个数字在1到n范围,假设甲乙已经知道,甲先猜乙后,都采用最优策略,主持人说偏大还是偏小,不断缩小范围,问最后乙能会获胜的X的取值的个数. 如果n为奇数,那么仅当x=n/2乙必然获胜,若为奇 ...
- Expedition(优先队列)
Expedition 点我 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9465 Accepted: 2760 Des ...