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

  • 相关阅读:
    2016中国大学生程序设计竞赛
    HDU 1671 Phone List (Trie·数组实现)
    Codeforces Round #367 (Div. 2) Hard problem
    UVA 133 The Dole Queue
    SG函数模板
    Codeforces Round #366 (Div. 2) C Thor(模拟+2种stl)
    [Offer收割]编程练习赛4 A 满减优惠
    CF #365 (Div. 2) D
    Codeforces Round #365 (Div. 2) Chris and Road
    codeblocks AStyle修改格式和快捷键
  • 原文地址:https://www.cnblogs.com/gfwei/p/10339699.html
Copyright © 2011-2022 走看看