C#,调用dll产生 "尝试读取或写入受保护的内存 。这通常指示其他内存已损坏。"的问题
Posted on 2019-01-30 20:27 孤峰皓月 阅读(18935) 评论(0) 编辑 收藏 举报由于易语言与c#做的DESC加解密方式,返回的数据不一致,所以,我用易语言写了一个dll,供c#调用,
结果在post的时候,有时候能正确返回数据,有时候则不能正常返回,而是返回空数据(c#没有做异常处理)
后来, 在c#端抛出异常后发现,原来返回空值,都已经报错了(提示:尝试读取或写入受保护的内存 。这通常指示其他内存已损坏。)
在网上查了,在c#调用 dll的时候,用指针的方式,就没有再出现问题。
1 2 3 4 5 6 7 8 9 | /// <summary> /// 这是易语言的DESC加密解密的dll /// </summary> /// <param name="strText">待加密的文本</param> /// <param name="key">密钥</param> /// <returns></returns> [DllImport( "DESEncrypt.dll" )] public static extern string Encrypt( string strText, string key);<br><br>[DllImport( "DESEncrypt.dll" )] public static extern string Decrypt( string strText, string key); |
改成如下方式:
1 2 3 4 5 6 7 | [DllImport( "DESEncrypt.dll" )] public static extern IntPtr Encrypt(IntPtr strText, IntPtr key); [DllImport( "DESEncrypt.dll" )] public static extern IntPtr Decrypt(IntPtr strText, IntPtr key); 返回值和参数,都改成 IntPtr 类型 |
调用的时候改成这种方式
IntPtr ptrIn = Marshal.StringToHGlobalAnsi(strPara);
IntPtr ptrIn2 = Marshal.StringToHGlobalAnsi("kimsSoftE");
IntPtr ptrIn3 = Decrypt(ptrIn, ptrIn2);
string[] strParaAry = Marshal.PtrToStringAnsi(ptrIn3).Split(',');
使用完后 释放 对象
Marshal.ReleaseComObject(strParaAry);
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步