1

C に func を使用するアンマネージ DLL があります。

char* My_Func(char* data, int input_length, int output_length);

この機能で私は持っています

result = (char*)malloc(output_lenght);
strcpy(result,test_char);
return(result);

C#で私はそれをインポートします

[DllImport(@"libsmev.DLL", CharSet = CharSet.Ansi)]
public static extern IntPtr My_Func([MarshalAs(UnmanagedType.LPStr)]string data, int input_length, out int output_length);

そして、それを呼び出します

IntPtr result = My_Func (n1, n1.Lenght,n2);

char* または IntPtr を解放するには?

Marshal.FreeHGlobal(IntPtr) と Marshal.FreeCoTaskMem(IntPtr) は機能しません。

4

3 に答える 3

4

を使用してポインターを解放できる関数をエクスポートする必要がありますfree。お気づきのように、これらの関数は別の割り当て関数を使用して割り当てられたポインターを期待しているため、機能Marshal.FreeHGlobalMarshal.FreeCoTaskMemません。

メモリを割り当ててこのメモリへのポインタを返す API を作成する場合は、API に関数を追加してメモリを解放する必要もあります。そうしないと、メモリの割り当てに使用されたライブラリ (この場合は C 標準ライブラリ) の外部で API を使用できなくなります。

于 2012-09-17T13:20:36.473 に答える
3

C では、次のようになります。

void Free_Obj(char* obj) {
    free(obj);
}

C# では、次のようになります。

[DllImport("libsmev.DLL")]
public static extern void Free_Obj(IntPtr obj);

そしてそれを呼び出します:

IntPtr result = My_Func (n1, n1.Lenght,n2);
Free_Obj(result);
于 2012-09-17T13:26:21.907 に答える
0

DLL でカスタム フリー関数を作成する代わりに、メモリを割り当てる代わりにCoTaskMemAllocを使用することもできます。malloc

その後、 を使用Marshal.FreeCoTaskMemして解放できます。

于 2012-09-17T13:29:55.380 に答える