Подпись несовместима с Interop - вызов методов c из c # - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь использовать функциональные возможности взаимодействия, чтобы создать .net-оболочку для написанной библиотеки pigpio. Однако я, кажется, застрял со следующей ошибкой: " Cannot marshal 'параметр # 2': подпись не совместима с Interop ". Метод C имеет следующую подпись:

int gpioWaveAddGeneric(unsigned numPulses, gpioPulse_t *pulses);

где gpioPulse_t:

typedef struct
{
   uint32_t gpioOn;
   uint32_t gpioOff;
   uint32_t usDelay;
} gpioPulse_t;

Я предполагал, что это будет подпись для вызова класса:

 [DllImport(Constants.PiGpioLibrary, CallingConvention = CallingConvention.Cdecl, EntryPoint = "gpioWaveAddGeneric")]
 public static extern int GpioWaveAddGeneric(uint numPulses, [In, MarshalAs(UnmanagedType.LPArray)] GpioPulse[] pulses);

где GpioPulse [] равен

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class GpioPulse
{
    private BitMask m_GpioOn;
    private BitMask m_GpioOff;
    private uint m_DelayMicroseconds;
    public BitMask GpioOn { get => m_GpioOn; set => m_GpioOn = value; }
    public BitMask GpioOff { get => m_GpioOff; set => m_GpioOff = value; }
    public uint DurationMicroSecs { get => m_DelayMicroseconds; set => m_DelayMicroseconds = value; }
}

и BitMask:

[Flags]
public enum BitMask : uint
{
    None = 0x00000000,
    All = 0xFFFFFFFF,
    Bit00 = 0x00000001,
    Bit01 = 0x00000002,
    Bit02 = 0x00000004,
    Bit03 = 0x00000008,
}

Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 17 января 2019

Решение: uint32_t в C # будет просто uint, поэтому ваш класс GpioPulse C # должен быть таким же простым, как и версия C, например, публичная структура GpioPulse {uint gpioOn; uint gpioOff; uint usDelay; }

...