gpt4 book ai didi

c# - 带有 PInvoke 的 C# 中的 C++ API

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:41:37 25 4
gpt4 key购买 nike

我有以下用 C++ 编写的函数。如何使用 PInvoke 在 C# 中正确声明和调用它?

SW_ErrCode SW_Connect (const char * server, int timeout, void * tag, SW_SessionID * sh_out)

在 C# 中,我有以下代码:

    public enum SW_ErrCode
{
SWERR_Success = 0,
SWERR_Truncated = 1,
SWERR_Connected = 3
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SW_SessionID
{
public int sessionId;
}

[DllImport("sw_api.dll")]
public static extern SW_ErrCode SW_Connect(string server, int timeout, IntPtr tag, out IntPtr sh_out);

static void Main(string[] args)
{
IntPtr infoPtr = new IntPtr();
IntPtr session;
int b = (int)SW_Connect("", 90, infoPtr, out session);
SW_SessionID s = (SW_SessionID)Marshal.PtrToStructure(session, typeof(SW_SessionID));
}

我认为最大的问题是“void * tag”和“SW_SessionID * sh_out”。如何正确使用该功能?

谢谢,K

最佳答案

你很接近。您可以获得 p/invoke 层来处理返回的结构。调用约定看起来像 cdecl。

[DllImport("sw_api.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern SW_ErrCode SW_Connect(
string server,
int timeout,
IntPtr tag,
out SW_SessionID sh_out
);

这样调用它:

SW_SessionID session;
SW_ErrCode retval = SW_Connect("", 90, IntPtr.Zero, out session);
// check retval for success

我对您对 Pack = 1 的使用也有些怀疑。如果它是正确的,那将是非常令人惊讶的。不过我不能肯定地说,因为你省略了很多相关细节。

关于c# - 带有 PInvoke 的 C# 中的 C++ API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27418934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com