请教大家 C#调用C++ DLL出现的疑难杂症

问题描述

请教大家一个问题,现在有个C++PCIDLL.dll文件,在C#中调用dll,老是出现错误如下:System.AccessViolationException:Attemptedtoreadorwriteprotectedmemory.Thisisoftenanindicationthatothermemoryiscorrupt.请问C#代码哪里有误,我试了几天都没解决,烦请高手指点,谢谢!C++Code:结构体:------------------------------------------typedefstruct_DEV_CTRL_PARAM{intScanType;intSelChannel[12];intmParamType;int*mEtalonPeakNum;float*p_EtalonPeakVal;}DEV_CTRL_PARAM,*PDEV_CTRL_PARAM;externBOOL_stdcallPci_InitDevice(intmDev,PDEV_CTRL_PARAMpParam);调用:--------------------------------------------intmEtalonPeakNum=0;floatEtalonPeakVal[400];DEV_CTRL_PARAMmParam;inttemptype[7]={6,5,4,3,2,1,0};mParam.ScanType=3;mParam.mParamType=0;mParam.mEtalonPeakNum=&mEtalonPeakNum;mParam.p_EtalonPeakVal=EtalonPeakVal;mParam.SelChannel[0]=1;mParam.SelChannel[1]=1;mParam.SelChannel[2]=1;mParam.SelChannel[3]=1;mParam.SelChannel[4]=1;mParam.SelChannel[5]=1;mParam.SelChannel[6]=1;mParam.SelChannel[7]=1;mParam.SelChannel[8]=1;mParam.SelChannel[9]=1;mParam.SelChannel[10]=0;mParam.SelChannel[11]=0;Pci_InitDevice(0,&mParam);----------------------------------------------------------------------------------C#Code:结构体:--------------[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]publicstructDEV_CTRL_PARAM{publicintScanType;[MarshalAs(UnmanagedType.ByValArray,ArraySubType=UnmanagedType.I4,SizeConst=12)]publicint[]SelChannel;publicintmParamType;publicIntPtrmEtalonPeakNum;publicIntPtrp_EtalonPeakVal;}[DllImport("PCIDLL.dll")]publicstaticexternboolPci_InitDevice(intmDev,refDEV_CTRL_PARAMpParam);调用:------------------------DEV_CTRL_PARAMmParam;mParam.SelChannel=newint[12];intmEtalonPeakNum=0;float[]EtalonPeakVal=newfloat[400];int[]temptype=newint[7]{6,5,4,3,2,1,0};mParam.ScanType=3;mParam.mParamType=0;mParam.mEtalonPeakNum=(IntPtr)mEtalonPeakNum;mParam.p_EtalonPeakVal=Marshal.UnsafeAddrOfPinnedArrayElement(EtalonPeakVal,0);mParam.SelChannel[0]=1;mParam.SelChannel[1]=1;mParam.SelChannel[2]=1;mParam.SelChannel[3]=1;mParam.SelChannel[4]=1;mParam.SelChannel[5]=1;mParam.SelChannel[6]=1;mParam.SelChannel[7]=1;mParam.SelChannel[8]=1;mParam.SelChannel[9]=1;mParam.SelChannel[10]=0;mParam.SelChannel[11]=0;Pci_InitDevice(0,refmParam);

解决方案

本帖最后由 wuyiming8 于 2012-01-16 16:18:54 编辑
解决方案二:
两个办法1,SelChannel用fixed关键字声明2,不用ref,直接使用指针至于行不行,我不知道你试试
解决方案三:
mParam.mEtalonPeakNum=(IntPtr)mEtalonPeakNum;mParam.p_EtalonPeakVal=Marshal.UnsafeAddrOfPinnedArrayElement(EtalonPeakVal,0);

不是这样的,需要使用StructToPtr或者PtrToStruct函数。如果是数组,那么需要分配本地内存。AllocCoTaskMem
解决方案四:
不能直接传递数组,可以用指针,或者用下面的办法。传递数组给C++DLL时,传递C#数组的第一个元素和数组长度,并且用ref。由于数组在内存中是连续存放的,DLL获取到第一个元素的ref和数组长度,自己用代码设定一下数组长度。Dll:fun(int[]array,intarrayLength)声明:[DllImport("xxx.dll",CallingConvention=CallingConvention.StdCall)]调用:fun(refarray[0],array.Length)我前几天用这种方法传递数组给delphi的DLL成功,C++应该也一样吧。
解决方案五:
C#中int,好像是32位的,你把那句改成[DllImport("PCIDLL.dll")]publicstaticexternboolPci_InitDevice(int32mDev,refDEV_CTRL_PARAMpParam);我也遇到这个问题的,搞了半天才弄出来的

时间: 2024-10-02 13:40:19

请教大家 C#调用C++ DLL出现的疑难杂症的相关文章

请教一个C#调用C++ DLL的问题

问题描述 C#中调用C++写的DLL,用DllImport好像只能用它的一些methods,如果想调用class的构造函数去生成一个新的object, 可行吗?有什么办法啊 谢谢!!! 解决方案 解决方案二:up解决方案三:这个...用C++/CLI做一层封装吧

请教一下,使用C#调用POSDLL.dll使用佳博打印的问题

问题描述 请教一下,使用C#调用POSDLL.dll使用佳博打印的问题OPOSOPOS=newOPOS();boola=OPOS.OpenUSBPort("USB001");publicboolOpenUSBPort(stringUSBPortName){POS_IntPtr=POS_Open(USBPortName,0,0,0,0,POS_OPEN_BYUSB_PORT);if((int)POS_IntPtr!=-1)returntrue;elsereturnfalse;}[DllI

使用JNative调用C# DLL文件 提示未找到方法

问题描述 最近项目需要使用一个C#的DLL文件的方法,用JNative去实现的,JNativeCpp.dll和需要调用的dll文件都放到windows/system32下了,然后newJNative("ABC.Portal.Common.dll","Token");提示这个Token方法找不到.org.xvolks.jnative.exceptions.NativeException:FunctionTokennotfoundatorg.xvolks.jnative

c#-C# 调用c++ dll问题,在线等,急~~~

问题描述 C# 调用c++ dll问题,在线等,急~~~ 请教大神, C# 如何调用C++的dll. 试了N次没成功,dll可以调用成功,但是传入的参数一直提示错误,请教大神如何调用方法,参数如何传,本人小白,大神最好能给点例子!感激不尽~~~. 解决方案 调用不成功是说直接找不到dll里的函数,还是说函数调用完返回的结果是错误的? 解决方案二: 参考:https://msdn.microsoft.com/zh-cn/library/2x8kf7zx.aspx 解决方案三: 参数是否传正确了,应

请问c#如何调用ntdll.dll中的ntquerysysteminformation函数??

问题描述 请问c#如何调用ntdll.dll中的ntquerysysteminformation函数??google了一下函数原形ntsysapintstatusntapintquerysysteminformation(inuintsysteminformationclass,//信息类型outpvoidsysteminformation,//缓冲指针inulongsysteminformationlength,//缓冲的字节大小outpulongreturnlengthoptional//写

异常-c# 程序调用外部dll文件对采集模块进行读写,不定时出现以下错误

问题描述 c# 程序调用外部dll文件对采集模块进行读写,不定时出现以下错误 问题签名: 问题事件名称: BEX 应用程序名: NangGang11.20.vshost.exe 应用程序版本: 9.0.21022.8 应用程序时间戳: 47316898 故障模块名称: MSVCR80.dll 故障模块版本: 8.0.50727.6195 故障模块时间戳: 4dcddbf3 异常偏移: 00008aa0 异常代码: c000000d 异常数据: 00000000 解决方案 光给出一个异常信息,天知

C# 制作Com组件:java调用.net DLL的方法

本文将详细为大家介绍一个java调用.net DLL的方法,以实现特殊的客户的特殊要求:"在Java项目中必须使用其提供的用.net写的DLL加密机制!" 环境与工具: ◆.net framework 3.5 C# ◆java jdk1.5, Tomcat 5.5 ◆jacob-1.15-M3 实现例子: 一.C# 制作Com组件 新建一个Class 项目,取名TestCom 代码 using System;  using System.Collections.Generic;  us

跨越语言的障碍:C++调用C# DLL

当C#项目需要引用C++dll的时候可以直接使用DLLIMPORT来进行调用.而反向的话,C++项目并不能简单靠引用来使用C#DLL.因为C++项目默认配置是没有公共语言运行库支持的.所以我们需要更改一些配置来进行对C# dll的调用.步骤如下: 首先我们完成C# dll开发: namespace Csharp { public class Class1 { public string Name = string.Empty; public Class1() { Name = "We can u

JAVA调用动态链接库DLL:JNative学习

JAVA调用动态链接库DLL的方法有:JNI(Java Native Interface),JInvoke,JNative(Java to native interface),JNI是JAVA自身提供的方法:JInvoke从何而来不得而知,好像还需要注册付费的,64位的JDK.JIR环境下运行不了,在VMware下安装的WindowsXP下同样有问题:JNative是开源的,但相关资料文档也特别的少,好像已经停止更新了.JNative源码地址:http://jnative.cvs.sourcef