Как маршалировать типы указателей при вызове функции C dll в C # - PullRequest
0 голосов
/ 04 февраля 2010

Мне нужно вызвать функцию переменного тока, импортированную из DLL.Я могу найти, как импортировать функцию API, но я не уверен, как упорядочить все типы, которые функция ожидает в качестве параметров.В частности, типы указателей.

Пример подписи функции может быть ...

Result_Type get_signal_value (SIG * sig, char * name, int * value);

, где SIG - этоструктура, содержащая различные предметы.например.struct SIG {char sig_id [16];int sig_ptr;HW_ADDR_TYPE hw_info;};

и

struct HW_ADDRESS_TYPE {short channel_no;шасси без знака;слот без знака;беззнаковая ссылка;заполнитель без знака;};

Я могу найти, что маршалу этого типа мне нужно описать структуру структуры ...

[StructLayout (LayoutKind.Sequential)] public class HW_ADDRESS_TYPE {short channel_no;байтовое шасси;байтовый слот;байтовая ссылка;байт-заполнитель;};

[StructLayout (LayoutKind.Sequential)] открытый класс SIG {public const int LEN_SID = 16;[MarshalAs (UnmanagedType.ByValTStr, SizeConst = LEN_SID)] публичная строка sig_id;int sig_ptr;HW_ADDRESS_TYPE hw_info;};

но, похоже, здесь есть проблемы.правильно ли я это сделал?

То же самое для int * в примере.

Любая помощь будет отличной.Ура!

1 Ответ

0 голосов
/ 04 февраля 2010
[StructLayout(LayoutKind.Sequential)]
struct SIG
{
    // describe the fields here
}

[DllImport("lib.dll")]
static extern bool get_signal_value(SIG sig, string name, float value);

Который вы могли бы назвать:

SIG sig = new SIG();
sig.Field1 = value1;
sig.Field2 = value2;
bool result = get_signal_value(sig, "abc", 1.5f);
...