Передать типы данных из C# в DLL на С

91
22 марта 2022, 07:40

Я создал веб-проект на ASP.NET CORE и к нему собрал и подключил библиотеку, написанную на C.

Чтобы использовать функции из библиотеки, необходимо определить в C# структуры данных. Со всеми типами данных разобрался остался вопрос с передачей двух типов, которые не знаю как интерпретировать.

#ifdef WIN32
#define thread_t    HANDLE
#define lock_t      CRITICAL_SECTION
#define initlock(f) InitializeCriticalSection(f)
#define lock(f)     EnterCriticalSection(f)
#define unlock(f)   LeaveCriticalSection(f)
#define FILEPATHSEP '\\'
#else
#define thread_t    pthread_t
#define lock_t      pthread_mutex_t
#define initlock(f) pthread_mutex_init(f,NULL)
#define lock(f)     pthread_mutex_lock(f)
#define unlock(f)   pthread_mutex_unlock(f)
#define FILEPATHSEP '/'
#endif

C# использует объект lock для блокировки потока и объект Thread для управления потоками, в C же это CRITICAL_SECTION и WINAPI thread.

Как мне передать эти объекты в C-DLL или отправить CRITICAL_SECTION и HANDLE из C#?

Answer 1

HANDLE = *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;
}
READ ALSO
Перенос данных между формами

Перенос данных между формами

Есть две формы, на одной отображаются данные в таблице на другой они добавляютсяНадо что бы после нажатия сохранить на второй форме, внесенные...

85
Если бы ASP.NET Core был одно-поточен

Если бы ASP.NET Core был одно-поточен

Согласно моему познанию ASPNET Core и если сильно не углубляться в детали, то на сегодняшний день обработка HTTP-запросов на одноядерном процессоре...

177
Обобщённое приведение IQueryable к IOrderedQueryable

Обобщённое приведение IQueryable к IOrderedQueryable

У меня есть generic метод преобразующий IQueryable<T> и возвращающий IOrderedQuerable<T> при помощи Linq-to-Entities

81
Как добавить ReactJS к проекту AspNet?

Как добавить ReactJS к проекту AspNet?

Пытаюсь как тут добавить ReactJS к проекту, но при добавлении этой строки:

113