DllImport を使用して、自分の .net クラスから C ラッパー ライブラリのメソッドを呼び出しています。c dll のこのメソッドは、文字列変数を作成し、文字列のポインターを返します。
このようなもの;
_declspec(dllexport) int ReturnString()
{
char* retval = (char *) malloc(125);
strcat(retval, "SOMETEXT");
strcat(retval, "SOMETEXT MORE");
return (int)retval;
}
次に、Marshall.PtrToStringAnsi(ptr) を使用して文字列を読み取ります。文字列のコピーを取得したら、free(ptr) を呼び出す C ラッパー ライブラリにある別の C メソッド HeapDestroy を呼び出すだけです。
これが質問です。最近、魔法のように機能しているときに、「保護されたメモリ領域の読み取りまたは書き込みを試みました」という例外が発生し始めました。より深い分析の後、私は、このポインターに対して無料のメソッドを呼び出しても、ポインターの値がクリアされず、ヒープが無人でいっぱいになり、iis ワーカー プロセスがこの例外をスローするようになると信じています。ちなみに、このメソッドをcライブラリで呼び出しているのはWebサイトプロジェクトです。
この問題について助けていただけませんか?
もちろん、これは C# コードです。
[DllImport("MyCWrapper.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private extern static int ReturnString();
[DllImport("MyCWrapper.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private extern static void HeapDestroy(int ptr);
public static string GetString()
{
try
{
int i = ReturnString();
string result = String.Empty;
if (i > 0)
{
IntPtr ptr = new IntPtr(i);
result = Marshal.PtrToStringAnsi(ptr);
HeapDestroy(i);
}
return result;
}
catch (Exception e)
{
return String.Empty;
}
}