C# сортировка для HANDLE и CRITICAL_SECTION - PullRequest
1 голос
/ 31 января 2020

Я занимаюсь разработкой приложения 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) )

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

a HANDLE - это *void в C / C ++, в 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

1 голос
/ 31 января 2020

Как насчет ссылки на них IntPtr? Я предполагаю, что вы не собираетесь изменять эти структуры из кода C# или даже пытаться передавать их по значению в код C (плохая идея), но передавать их указатель на функцию P / Invoked.

Так что просто укажите их как IntPtr, что эквивалентно void*

...