c# - C# 中的 C++ API 和 PInvoke

标签 c# c++ api pinvoke

我有以下用 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# - C# 中的 C++ API 和 PInvoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27418934/

相关文章:

c# - 身份验证过滤器不适用于 Web API 中的授权过滤器

jquery - html5 的文件 api 示例与 jquery?

ios - 解码从 HTTP API 请求接收到的数据

c# - 您如何确定两个 HashSet 是否相等(按值,而不是按引用)?

c# - 函数Int32.TryParse(“23.0”)返回false-C#MVC4

c# - StreamReader.EndOfStream 缺少最后一行?

c++ - 将 Boost 正确安装到 Qt 中(当前失败,权限被拒绝)

c++ - 使用 INSTANTIATE_TEST_CASE_P 的同一 Fixture 的不同实例

c++ - g++ 上 constexpr 上下文中成员指针的 static_cast

javascript - 多次循环调用 API 获得随机结果