HANDLE 和 CRITICAL_SECTION 的 C# 编组

C# marshalling for HANDLE and CRITICAL_SECTION

我正在开发 C# (.NET Core) 应用程序,我需要从外部库调用 C 函数。

但是我在编组 thread_tlock_t 时遇到了问题。

这是 C 代码:

EXPORT void strsvrinit (strsvr_t *svr, int nout);

typedef struct {        /* stream server type */
    int state;          /* server state (0:stop,1:running) */
    ...
    thread_t thread;    /* server thread */
    lock_t lock;        /* lock flag */
} strsvr_t;

#ifdef WIN32
#define thread_t    HANDLE
#define lock_t      CRITICAL_SECTION
#else
#define thread_t    pthread_t
#define lock_t      pthread_mutex_t
#endif

如何实现 thread_t (HANDLE) 和 lock_t (CRITICAL_SECTION) 的封送处理?

IntPtr 引用它们怎么样?我假设您不会从 C# 代码修改这些结构,甚至不会尝试将它们按值传递给 C 代码(坏主意),而是将它们的指针传递给 P/Invoked 函数。

所以只需将它们引用为 IntPtr,基本上等同于 void*

a HANDLE 在 C/C++ 中是 *void,在 C# 中是 IntPtr.

CRITICAL_SECTION是一个结构:

typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;

typedef struct _RTL_CRITICAL_SECTION {
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
    LONG LockCount;
    LONG RecursionCount;
    HANDLE OwningThread; 
    HANDLE LockSemaphore;
    ULONG_PTR SpinCount;
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

在 C# 代码中:

[StructLayout(LayoutKind.Sequential)]
public struct CRITICAL_SECTION {
    public IntPtr DebugInfo;
    public int LockCount;
    public int RecursionCount;
    public IntPtr OwningThread;
    public IntPtr LockSemaphore;
    public UIntPtr SpinCount;
}

t3f 回答