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

    由于易语言与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);

  • 相关阅读:
    呈现系统-组件间的通信方式(7)
    web项目中图标的前端处理方案
    ADO--数据访问技术
    canvas--绘制路径
    canvas--改变颜色
    canvas-在画布中画两个方块(一个空心一个实体)
    canvas--画布《第一步》
    拼图游戏【简单】
    判断字符串是否为空--string.Empty、string=""、s.length==0
    判断Char是否为数字
  • 原文地址:https://www.cnblogs.com/gfwei/p/10339699.html
Copyright © 2011-2022 走看看