1. 程式人生 > >C#,調用dll產生 "嘗試讀取或寫入受保護的內存 。這通常指示其他內存已損壞。"的問題

C#,調用dll產生 "嘗試讀取或寫入受保護的內存 。這通常指示其他內存已損壞。"的問題

text sta 參數 light lan 提示 param str 異常處理

由於易語言與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#,調用dll產生 "嘗試讀取或寫入受保護的內存 。這通常指示其他內存已損壞。"的問題