HANDLE 和 CRITICAL_SECTION 的 C# 编组
C# marshalling for HANDLE and CRITICAL_SECTION
我正在开发 C# (.NET Core) 应用程序,我需要从外部库调用 C 函数。
但是我在编组 thread_t
和 lock_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 回答
我正在开发 C# (.NET Core) 应用程序,我需要从外部库调用 C 函数。
但是我在编组 thread_t
和 lock_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 回答