0

我正在尝试为 .net 设置 freetype2,但我仍然不够幸运。所以我正在使用这个问题的答案。目前,我尝试使用 Init_FreeType 函数时遇到一个异常,我试图将其写入受保护的内存。我使用的代码如下:

Intptr library = new Intptr();
FreeType.FT.Init_FreeType(library);

包装器中 Init_FreeType 函数的声明如下:

[DllImport(FT_DLL, EntryPoint = "FT_Init_FreeType"), SuppressUnmanagedCodeSecurity]
public static extern int Init_FreeType(IntPtr /*IntPtr LibraryRec_*/ alibrary);

有任何想法吗?

4

1 回答 1

1

在我看来,声明Init_FreeType是错误的。应该是:

public static extern int Init_FreeType(ref IntPtr alibrary);

(参数是 a ref)。并称之为:

IntPtr library = IntPtr.Zero;
FreeType.FT.Init_FreeType(ref library);

我怀疑正在发生的事情是Init_FreeType将传递的值视为引用并尝试将库句柄存储在该内存位置。但是由于您传递的是指针的(而不是指针的位置),它就会陷入困境。

回复评论的更多信息:

FT_Init_FreeType的文档将其定义为:

FT_EXPORT( FT_Error ) FT_Init_FreeType( FT_Library  *alibrary );

FT_Error是一个int,并且FT_Library

typedef struct FT_LibraryRec_  *FT_Library;

所以你肯定需要refon call。托管原型应该如我上面所示。

堆栈不平衡几乎肯定是由错误的调用约定引起的。在 .NET 中,默认调用约定是 stdcall。在我看来,FreeType 正在使用 cdecl 调用约定。所以你DllImport应该是:

[DllImport(FT_DLL, EntryPoint="FT_Init_FreeType", 
    CallingConvention=CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
于 2012-04-05T22:18:03.253 回答