C#调用C++函数待字符数组 不定期死机

问题描述

我的C++导出函数:int__stdcalltransCard(char*strReq,char*strResp);我C#里的导入代码:[DllImport("api.dll",EntryPoint="transCard")]publicstaticexterninttransCard(char[]strReq,byte[]strResp);调用transCard运行十几次,必定会出现如下如下错误:"运行库遇到了错误。此错误的地址为0x79ef067e,在线程0xe58上。错误代码为0xc0000005。此错误可能是CLR中的bug,或者是用户代码的不安全部分或不可验证部分中的bug。此bug的常见来源包括用户对COM-interop或PInvoke的封送处理错误,这些错误可能会损坏堆栈。"transCard返回的字符都是能正确识别的。搞了搞几天了,一天头绪都没有。网上说是参数字符数组,函数约定调用的问题,求大牛指点下

解决方案

解决方案二:
char[]->byte[]
解决方案三:
引用楼主a6624624的回复:

...int__stdcalltransCard(char*strReq,char*strResp);...

你完全可以指责C++部分:)因为它没有清楚约定进出关系,没有缓冲区长度指示。你的错误很可能是缓冲溢出造成的。
解决方案四:
引用楼主a6624624的回复:

我的C++导出函数:int__stdcalltransCard(char*strReq,char*strResp);我C#里的导入代码:[DllImport("api.dll",EntryPoint="transCard")]publicstaticexterninttransCard(char[]strReq,byte[]strResp);调用transCard运行十几次,必定会出现如下如下错误:"运行库遇到了错误。此错误的地址为0x79ef067e,在线程0xe58上。错误代码为0xc0000005。此错误可能是CLR中的bug,或者是用户代码的不安全部分或不可验证部分中的bug。此bug的常见来源包括用户对COM-interop或PInvoke的封送处理错误,这些错误可能会损坏堆栈。"transCard返回的字符都是能正确识别的。搞了搞几天了,一天头绪都没有。网上说是参数字符数组,函数约定调用的问题,求大牛指点下

看错误提示像是写出界了,如果char*不需要返回,使用string来对应;如果需要返回值,使用stringbuilder来对应,当然使用stringbuilder需要自己初始化大小。可以在c++代码中添加日志信息,核对是否有特殊的字符不定期的出现
解决方案五:
引用1楼crystal_lz的回复:

char[]->byte[]

这样声明:publicstaticexterninttransCard(byte[]strReq,byte[]strResp);??跟CallingConvention设置没关系?关于这2个参数我解释下,strReq是我填充传入的,strResp是等C++填充字符然后C#这边解析然后显示。在C#中,这样调用:TransCard(strReq.ToString().ToCharArray(),btStrResp)C#中参数定义如下privateStringBuilderstrReq=null;byte[]btStrResp=newbyte[1024];
解决方案六:

解决方案七:

解决方案八:

解决方案九:

解决方案十:

解决方案十一:

解决方案十二:

解决方案十三:

解决方案十四:

解决方案十五:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:
然后在网上看到资料关于C++和C#的参数类型对照表:http://my.oschina.net/u/216751/blog/178834//c++:char*----c#:string//传入参数//c++:char*----c#:StringBuilder//传出参数
解决方案:
引用3楼xian_wwq的回复:

Quote: 引用楼主a6624624的回复:
我的C++导出函数:int__stdcalltransCard(char*strReq,char*strResp);我C#里的导入代码:[DllImport("api.dll",EntryPoint="transCard")]publicstaticexterninttransCard(char[]strReq,byte[]strResp);调用transCard运行十几次,必定会出现如下如下错误:"运行库遇到了错误。此错误的地址为0x79ef067e,在线程0xe58上。错误代码为0xc0000005。此错误可能是CLR中的bug,或者是用户代码的不安全部分或不可验证部分中的bug。此bug的常见来源包括用户对COM-interop或PInvoke的封送处理错误,这些错误可能会损坏堆栈。"transCard返回的字符都是能正确识别的。搞了搞几天了,一天头绪都没有。网上说是参数字符数组,函数约定调用的问题,求大牛指点下

看错误提示像是写出界了,如果char*不需要返回,使用string来对应;如果需要返回值,使用stringbuilder来对应,当然使用stringbuilder需要自己初始化大小。可以在c++代码中添加日志信息,核对是否有特殊的字符不定期的出现

strReq是我填充传入的,strResp是等C++填充字符然后C#这边解析然后显示
解决方案:
引用4楼a6624624的回复:

Quote: 引用1楼crystal_lz的回复:
char[]->byte[]

这样声明:publicstaticexterninttransCard(byte[]strReq,byte[]strResp);??跟CallingConvention设置没关系?关于这2个参数我解释下,strReq是我填充传入的,strResp是等C++填充字符然后C#这边解析然后显示。在C#中,这样调用:TransCard(strReq.ToString().ToCharArray(),btStrResp)C#中参数定义如下privateStringBuilderstrReq=null;byte[]btStrResp=newbyte[1024];
解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:

解决方案:
然后在网上看到资料关于C++和C#的参数类型对照表:http://my.oschina.net/u/216751/blog/178834//c++:char*----c#:string//传入参数//c++:char*----c#:StringBuilder//传出参数

在c、c++中char是一个字节的C#中的char是两个字节类型什么的只是编程中的一个约束就算是你写成intIntPtr都行这都不重要重要的是你实际传入的是什么数据这个数据是[in]还是[out]更具这些条件来确定自己使用什么类型或许你上面的可以用string也可以用stringbuilder当时不知道你具体功能的情况下byte[]肯定是万能的因为所有数据都可以转成byte[]
解决方案:
引用2楼Forty2的回复:

Quote: 引用楼主a6624624的回复:
...int__stdcalltransCard(char*strReq,char*strResp);...

你完全可以指责C++部分:)因为它没有清楚约定进出关系,没有缓冲区长度指示。你的错误很可能是缓冲溢出造成的。

int__stdcalltransCard(char*strReq,char*strResp);这里应该是约定了吧?strReq是进入C++strResp是C++传出

时间: 2024-09-28 19:07:57

C#调用C++函数待字符数组 不定期死机的相关文章

联想Y40笔记本win7系统经常不定期死机的原因和应对措施

  解决方法:随机性死机故障产生的原因主要是以下三个方面,具体如下: 1.软件方面的原因 软件系统引起的联想笔记本Y40Win7系统不定期死机,即随机性死机包括两种情况: 1.受到病毒破坏 虽然有时可以通过冷.热启动再次启动电脑,但运行不久又会死机. 2.应用软件与操作系统不完全兼容 彼此之间有冲突或者与硬件固有的特性发生冲突,这种死机大多没有键盘响应,只能通过冷启动再次启动电脑. 软件原因检测方法:使用干净的引导盘重新引导机器后,再运行杀毒软件清除病毒.对于应用软件与操作系统有冲突,建议采用修

深入解析C++中的字符数组和处理字符串的方法_C 语言

C++字符数组 用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符.字符数组具有数组的共同属性.由于字符串应用广泛,C和C++专门为它提供了许多方便的用法和函数. 字符数组的定义和初始化 定义字符数组的方法与前面介绍的类似.例如: char c[10]; c[0]=′I′;c[1]=′ ′;c[2]=′a′;c[3]=′m′;c[4]=′ ′;c[5]=′h′;c[6]=′a′;c[7]=′p′;c[8]=′p′;c[9]=′y′; 上面定义了c为字符数组,包含10个元素.在赋值

函数调用-如何调用函数打印出数组

问题描述 如何调用函数打印出数组 我已经编写了函数itob(n,s,d),将整数n转换为以b为底的数,并将转换结果以字符形式保存到字符串s中.请问既然函数的返回值不能是数组,那么如何在main 函数中调用这个itob函数打印出字符串s?(刚入门的新手,很多函数没有学) 解决方案 void main() { char buf[50]; int num=100; itob(num,buf,8);//你设计的函数形参s应该是个指针,这样在函数内部转换完,在main函数就可以打印. printf("%s

vb-VB 调用fortran函数(已经生成dll),怎么实现数组的传递?

问题描述 VB 调用fortran函数(已经生成dll),怎么实现数组的传递? VB调用fortran生成的dll.传数值,我已经实现,但是传数组地址没成功, 但是用C语言就可以找到数组的首地址,但是VB就不行,请VB的高手指教 fortran 代码如下(生成dll): subroutine ComputeFwd_DC1D(Pm,nParams,AB2,nd) !DEC$ ATTRIBUTES REFERENCE::Pm,nParams,AB2,nd implicit none integer

探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解_php技巧

Smarty中如何获取数组的长度 前提假设:分配了一个数组array给Smarty,假设Smarty的分界符为'{' 和'}'.在很多资料上都看到,在Smarty中要求数组的长度时,可以用在数组后便加|count的方法调用.即通过{array|count}获得array的长度.但是今天在写模板时,发现这样得不到数组的长度,而只是得到一个返回的字符串Array.也就是说仅仅是返回了{array}的结果,而没有返回其array的长度. 查看smarty\plugins文件夹,发现并没有count的相

c语言-C语言里想要用函数创建一个新的字符数组,并使其等于原有的一个字符数组该怎么做?

问题描述 C语言里想要用函数创建一个新的字符数组,并使其等于原有的一个字符数组该怎么做? #include #include #include char map[4][4]; char creat()//创建一个新的字符数组 { char *maze=(char)malloc(sizeof(map)); return maze; } void main() { int i,j; for(i=0;i<4;i++) { gets(map[i]); } char *maze=creat(); strc

c++-编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。

问题描述 编程实现两字符串的连接.要求使用字符数组保存字符串,不要使用系统函数. 编程实现两字符串的连接.定义字符数组保存字符串,在程序中提示用户输入两个字符串,实现两个字符串的连接,最后用cout语句显示输出.用cin实现输入,注意,字符串的结束标志是ASCII码0,使用循环语句进行字符串间的字符拷贝. #include using namespace std; int main() { char a[500]; char b[500]; cin>>a; for(int i=0;i if(

2013级C++第14周项目——一维数组、字符数组

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1 - 数组大折腾] 将所有元素值加倍后保存在数组中,最后由前往后输出数组中所有元素的值,再由后往前输出数组中所有元素的值,再输出数组中的所有大于100的数,以及下标为3的倍数的元素值. (1)创建一个长度为20的整型数组,通过初始化,为数组中的前10个元素赋初值,然后通过键盘输入后10个元素的值,从前往后(从第0个到第19个)输出数组中元素的值,每5个元素换一行.

【C/C++学院】0815-函数包装器/CPP类型转换/函数模块/动态数组

函数包装器管理内嵌函数 #include<iostream> #include<functional> //函数包装器 //第一,设计执行接口,接口设计关卡(),计数 //第二,函数包装器依赖于函数模板,实现通用泛型 //第三,函数代码可以内嵌在另外一个函数,实现函数怀孕 //函数包装器,用于管理内嵌函数,外部函数调用 //函数包装器, T数据类型, F是函数 template<typename T,typename F> T run(T v, F f) { stati