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

  • 相关阅读:
    C#基础知识整理(一)c#语言基础—数据运算
    Socket 基于完整CS样式例子(转载)
    LVS NAT模式实战案例
    LVS DR模式实战案例
    Kubernetes 概述及Kubernetes各个组件概述
    k8s 基于kubeasz(ansible) 搭建高可用集群 kubernetes v1.22.2
    Linux LVS 介绍
    Python 读写字节数据(转)
    帮你克服web字体选择焦虑症
    python 深拷贝 浅拷贝
  • 原文地址:https://www.cnblogs.com/gfwei/p/10339699.html
Copyright © 2011-2022 走看看