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

  • 相关阅读:
    Linux安装Memcached服务
    [Shell]随机数
    配置VNC
    Linux挂在ntfs格式的U盘
    大数据入门第五天——离线计算之hadoop(上)概述与集群安装
    Hexo+Github博客搭建
    大数据入门第四天——基础部分之轻量级RPC框架的开发
    大数据入门第三天——基础补充与ActiveMQ
    大数据入门第二天——基础部分之zookeeper(下)
    PowerDesigner安装与使用教程
  • 原文地址:https://www.cnblogs.com/gfwei/p/10339699.html
Copyright © 2011-2022 走看看