我在从OpenSsl 1.0.2 beta封送SSL_ctrl函数时遇到问题。

这个函数是

long  SSL_ctrl(SSL *ctx, int cmd, long larg, void *parg);


我试图将其封送为

[DllImport(SSLDLLNAME, CallingConvention = CallingConvention.Cdecl)]
public static extern long SSL_ctrl(IntPtr /* SSL* */ ssl,
                               int cmd,
                               long larg,
                               IntPtr parg);


我已经在Visual Studio中启用了本机代码调试。

问题是最后一个论点。

我尝试用不同的指针(非零)调用该函数,但结果始终相同:
本机代码接受parg,但parg等于0x0

我尝试传递字符串(通过调用Marshal.StringToHGlobalAnsi(serverName)),获得指针
尝试传递一些生成的非零指针,但结果始终相同。 parg在本机代码中为0x0。

您能帮我解决这个问题吗?

最佳答案

C#中的long等效于C中的int64_t。C中long的大小取决于实现方式,并且在大多数Win32实现中,其等效于int32_t。因此,您在非托管代码中观察到的值parg是托管代码中larg的高32位的值。

通常,不建议在C互操作性接口中使用依赖于实现的类型。

07-28 13:58