C#调用其他语言DLL库,提示尝试读取或写入受保护的内存。这通常指示其他内存已损坏

问题描述

C#调用其他语言DLL库,提示尝试读取或写入受保护的内存。这通常指示其他内存已损坏代码如下==========================================DLL函数int__stdcallActionReceived(constchar*devId,constint*windowId,constchar*cmd,char*data)==========================================C#调用[DllImport(@"Caller.dll",CallingConvention=CallingConvention.StdCall)]publicstaticexternintActionReceived(StringdevId,refintwindowId,Stringcmd,StringBuilderdata);intk=1;StringBuilderbuilder=newStringBuilder(256);inta=ActionReceived("test",refk,"call",builder);

解决方案

解决方案二:
这通常都是参数类型不匹配引起的
解决方案三:
因为dll里使用了指针如果参数类型不匹配,传入的数据就会造成指针越界,访问不可读写的内存
解决方案四:
引用2楼Z65443344的回复:

因为dll里使用了指针如果参数类型不匹配,传入的数据就会造成指针越界,访问不可读写的内存

请问现在要怎么改呢?我现在一点头绪也没有
解决方案五:
将Char*类型的全部定义成StringBuilder试试看...
解决方案六:
引用4楼u012804018的回复:

将Char*类型的全部定义成StringBuilder试试看...

还是报错
解决方案七:
封送的数据类型与目标不匹配publicstaticexternintActionReceived([MarshalAs(UnmanagedType.LPStr)]StringdevId,intwindowId,[MarshalAs(UnmanagedType.LPStr)]Stringcmd,[MarshalAs(UnmanagedType.LPStr)]StringBuilderdata);上面假设你的dll编译时采用的多字节字符集ANSI编译的如果采用的是宽字节(Unicode)编译,就改成[MarshalAs(UnmanagedType.LPWStr)]
解决方案八:
引用6楼dongxinxi的回复:

封送的数据类型与目标不匹配publicstaticexternintActionReceived([MarshalAs(UnmanagedType.LPStr)]StringdevId,intwindowId,[MarshalAs(UnmanagedType.LPStr)]Stringcmd,[MarshalAs(UnmanagedType.LPStr)]StringBuilderdata);上面假设你的dll编译时采用的多字节字符集ANSI编译的如果采用的是宽字节(Unicode)编译,就改成[MarshalAs(UnmanagedType.LPWStr)]

也不行
解决方案九:
最后一个参数,你好像不知道是怎么返回的。你先确定一下,C语言是如何成功调用的。
解决方案十:
引用8楼Saleayas的回复:

最后一个参数,你好像不知道是怎么返回的。你先确定一下,C语言是如何成功调用的。

因为我用的的厂房给的动态库,只有给的参数说明表,其他都没有
解决方案十一:
int__stdcallActionReceived(constchar*devId,constint*windowId,constchar*cmd,char*data)你知道最后一个参数,作为缓冲区,她期望的大小吗?
解决方案十二:
试试:[System.Runtime.InteropServices.DllImportAttribute("Caller.dll",EntryPoint="ActionReceived",CallingConvention=System.Runtime.InteropServices.CallingConvention.StdCall)]publicstaticexternintActionReceived([System.Runtime.InteropServices.InAttribute()][System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]stringdevId,refintwindowId,[System.Runtime.InteropServices.InAttribute()][System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]stringcmd,System.IntPtrdata);
解决方案十三:
如果不是最后一个参数的问题,可能就是intconst*windowId的问题。这更加像一个传入数组。

时间: 2024-08-01 13:36:58

C#调用其他语言DLL库,提示尝试读取或写入受保护的内存。这通常指示其他内存已损坏的相关文章

C# 调用C++DLL的问题“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

问题描述 这是c#代码usingSystem.Runtime.InteropServices;namespaceWinCallDll{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}[DllImport(@"......DebugMyDllC.dll",EntryPoint="Add")]publicstaticexternintSendMessage(inta,intb);priv

dll c#-c#调用c++的dll出现尝试读取或写入受保护的内存问题

问题描述 c#调用c++的dll出现尝试读取或写入受保护的内存问题 使用c#调用c++的一个dll.c++的接口函数为: extern "C" __declspec(dllexport)bool __stdcall CreateDetmObject(IDetManager **ppDetManager); 参数IDetManager为一个结构体: struct IDetManager { virtual void __stdcall SetListener(HWND hWnd) = 0

求助,C#调用C++dll时提示:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 C++dll的头文件接口描述如下:#pragmapack(push,1)typedefstructXCtrlStatus{XCtrlStatus(unsignedlongV=0){*reinterpret_cast<unsignedlong*>(this)=V;}unsignedcharERR:1;unsignedcharAUTO:1;unsignedcharRUN:2;unsignedcharDIR:2;unsignedchar:1;unsignedchar:1;unsignedc

winform-C# Winform项目中, 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 C# Winform项目中, 尝试读取或写入受保护的内存.这通常指示其他内存已损坏. C/C++ 代码,这个是第三方提供的外部方法(调用"华大HD-900身份证阅读器接口函数"):int HD_Read_BaseInfo(char* pBmpData char *pName char *pSex char *pNation char *pBirth char *pAddress char *pCertNo char *pDepartment char *pEffectData

C# 读取HTML的时候出错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 只要html文件存在着句话<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXhtml1.0Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,读取就会报错,提示尝试读取或写入受保护的内存.这通常指示其他内存已损坏.去掉这句话就没问题了:用到了HTMLEditorControl控件,高手帮解决下 解决方案 解决方案二:呵呵.用WebBrowser.Docum

C# 调用C++的dll,提示&amp;amp;quot;尝试读取或写入受保护的内存。这通常指示其他内存已损坏&amp;amp;quot;

问题描述 C++:GPSSUPPORT_APIint__stdcallress(unsignedchar*compr,unsignedlongcomprLen,unsignedchar**uncompr,unsignedlong*uncomprLen);C#:publicstaticexternintZlibUncompress(refbyte[]compr,longcomprLen,refbyte[]uncompr,reflonguncomprLen);调用:privatebyte[]Keys

c#调用dll 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 调用一个自己写的c++的dll,结果出现问题提示如下:"System.AccessViolationException"类型的未经处理的异常出现在BidingSystem_Client.exe中.其他信息:尝试读取或写入受保护的内存.这通常指示其他内存已损坏.--------------------------------------------c#[DllImport("PEKS.dll",CharSet=CharSet.Ansi,CallingConv

c++-C# 调用C++ dll是出现这样的错误“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 C# 调用C++ dll是出现这样的错误"尝试读取或写入受保护的内存.这通常指示其他内存已损坏. 调试时是这样的: SDK上是这样说明的: 我调用这个dll时是这样的: 困扰了很久,希望有大神来看一看,感激不敬 解决方案 C#尝试读取或写入受保护的内存.这通常指示其他内存已损坏.C# 尝试读取或写入受保护的内存 .这通常指示其他内存已损坏.C#尝试读取或写入受保护的内存.这通常指示其他内存已损坏. 解决方案二: 先看是不是你的参数有问题,然后就是数据对不对 解决方案三: 是不是重复调用

c#调用delphi编写的dll文件报错,尝试读取或写入受保护的内存

问题描述 c#调用delphi编写的dll文件报错,尝试读取或写入受保护的内存 delphi函数原型 Procedure invoke(params :PChar; result : PChar) ; 解决方案 把这个delphi的原型改一下,改为 Function Pchar invoke(params :PChar) ; 再试试 解决方案二: Function invoke(params: PAnsiChar): PAnsiChar ;