我在从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互操作性接口中使用依赖于实现的类型。