码迷,mamicode.com
首页 > Windows程序 > 详细

C#,调用dll产生 "尝试读取或写入受保护的内存 。这通常指示其他内存已损坏。"的问题

时间:2019-01-30 21:47:25      阅读:442      评论:0      收藏:0      [点我收藏+]

标签:处理   lob   int   soft   sha   dll   一个   mars   sso   

由于易语言与c#做的DESC加解密方式,返回的数据不一致,所以,我用易语言写了一个dll,供c#调用,

结果在post的时候,有时候能正确返回数据,有时候则不能正常返回,而是返回空数据(c#没有做异常处理)

后来, 在c#端抛出异常后发现,原来返回空值,都已经报错了(提示:尝试读取或写入受保护的内存 。这通常指示其他内存已损坏。)

在网上查了,在c#调用 dll的时候,用指针的方式,就没有再出现问题。

/// <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);

[DllImport("DESEncrypt.dll")]
public static extern string Decrypt(string strText, string key);

 

改成如下方式:

[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);

 

C#,调用dll产生 "尝试读取或写入受保护的内存 。这通常指示其他内存已损坏。"的问题

标签:处理   lob   int   soft   sha   dll   一个   mars   sso   

原文地址:https://www.cnblogs.com/gfwei/p/10339699.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!