C # Fatal Execution Engine Ошибка вызова динамически загруженного DLL

Я начал программировать на C # пару недель назад (в основном из Java), и сейчас я борюсь с использованием библиотеки libMPSSE.dll.

Вот как я импортирую функции:

        [DllImportAttribute("libMPSSE.dll", EntryPoint = "I2C_GetNumChannels", CallingConvention = CallingConvention.Cdecl)]
public static extern uint I2C_GetNumChannels(ref uint NumChannels);

[DllImportAttribute("libMPSSE.dll", EntryPoint = "I2C_OpenChannel", CallingConvention = CallingConvention.Cdecl)]
public static extern uint I2C_OpenChannel(uint index, ref IntPtr handler);

[DllImportAttribute("libMPSSE.dll", EntryPoint = "I2C_GetChannelInfo", CallingConvention = CallingConvention.Cdecl)]
private static extern uint I2C_GetChannelInfo(uint index, ref FT_DEVICE_LIST_INFO_NODE chanInfo);

И вот как выглядит заголовочный файл C ++ в .dll:

FTDI_API FT_STATUS I2C_GetNumChannels(uint32 *numChannels);
FTDI_API FT_STATUS I2C_GetChannelInfo(uint32 index, FT_DEVICE_LIST_INFO_NODE *chanInfo);
FTDI_API FT_STATUS I2C_OpenChannel(uint32 index, FT_HANDLE *handle);

Первые два работают нормально, но если я вызываю третий, я получаю FatalExecutionEngineError:

       for (uint i = ch; i >= 0; i--) { //ch contains number of chans available

FT_DEVICE_LIST_INFO_NODE nodeInfo = new FT_DEVICE_LIST_INFO_NODE();

I2C_GetChannelInfo(i, ref nodeInfo); // crash here
Console.WriteLine(" > info: "+nodeInfo.Description);

}
}

Я предполагаю, что сбой вызван параметром FT_DEVICE_LIST_INFO_NODE, который выглядит так в моем коде:

    public class FT_DEVICE_LIST_INFO_NODE
{
public UInt32 Flags;
public FTDI.FT_DEVICE Type;
public UInt32 ID;
public UInt32 LocId;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string SerialNumber;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string Description;

public IntPtr ftHandle;
}

И согласно документации .dll, выглядит так в коде c ++:

typedef struct _ft_device_list_info_node {
DWORD Flags;
DWORD Type;
DWORD ID;
DWORD LocId;
char SerialNumber[16];
char Description[64];
FT_HANDLE ftHandle;
} FT_DEVICE_LIST_INFO_NODE;

Я как бы заблудился прямо сейчас и просто пытаюсь ошибиться, не зная, как решить эту проблему, конечно, это не помогает, это мой первый раз, когда я использую неуправляемый .dll: D

Библиотеку можно найти здесь http://www.ftdichip.com/Support/SoftwareExamples/MPSSE/LibMPSSE-I2C.htm
с документацией, доступной здесь
http://www.ftdichip.com/Support/Documents/AppNotes/AN_177_User_Guide_For_LibMPSSE-I2C.pdf

заранее спасибо

/ edit: я забыл перечисление FT_DEVICE

        public enum FT_DEVICE
{
/// <summary>
/// FT232B or FT245B device
/// </summary>
FT_DEVICE_BM = 0,
/// <summary>
/// FT8U232AM or FT8U245AM device
/// </summary>
FT_DEVICE_AM,
/// <summary>
/// FT8U100AX device
/// </summary>
FT_DEVICE_100AX,
/// <summary>
/// Unknown device
/// </summary>
FT_DEVICE_UNKNOWN,
/// <summary>
/// FT2232 device
/// </summary>
FT_DEVICE_2232,
/// <summary>
/// FT232R or FT245R device
/// </summary>
FT_DEVICE_232R,
/// <summary>
/// FT2232H device
/// </summary>
FT_DEVICE_2232H,
/// <summary>
/// FT4232H device
/// </summary>
FT_DEVICE_4232H,
/// <summary>
/// FT232H device
/// </summary>
FT_DEVICE_232H,
/// <summary>
/// FT232X device
/// </summary>
FT_DEVICE_X_SERIES
};

0

Решение

Спасибо, вы когда-нибудь, я получил его сейчас.
Я сделал структуру из FT_DEVICE_LIST_INFO_NODE и добавил атрибуты LayoutKind.Sequential и CharSet.Ansi. Я также изменил FTDI.FT_DEVICE на простой uint для целей тестирования, и теперь он запускается.

    [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct FT_DEVICE_LIST_INFO_NODE
{public uint Flags;
public uint Type;
public uint ID;
public uint LocId;

/// char[16]
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)]
public string SerialNumber;

/// char[64]
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 64)]
public string Description;
}
0

Другие решения


По вопросам рекламы [email protected]