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

  • 相关阅读:
    基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果(转)
    javascript中call、apply、argument、callee、caller
    Google Analytics10条有用教程(转)
    小问题
    MySQL exists的用法介绍
    warning C4005: “AF_IPX”: 宏重定义的解决办法
    /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
    _mkdir
    文件读写操作总结
    Distinct
  • 原文地址:https://www.cnblogs.com/gfwei/p/10339699.html
Copyright © 2011-2022 走看看