Я начал программирование в C# пару недель назад (исходя из большей части java), и я в настоящее время борюсь с использованием библиотеки libMPSSE.dll.C# Fatal Execution Engine Ошибка при вызове динамически загружаемой .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_LI ST_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
Заранее спасибо
/редактировать: я забыл 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
};
Ваше маршалинг не передает перезаписываемый буфер строки. См. [По умолчанию маршалинг для строк] (https://msdn.microsoft.com/en-us/library/s9ts558h%28v=vs.110%29.aspx) (особенно раздел Строковые буферы с фиксированной длиной) – theB
Вы также должны добавление '[StructLayout (LayoutKind.Sequential)]' к вашему определению структуры, иначе среда выполнения может изменить элементы структуры, чтобы упаковать другой способ. –
Вы также должны показать свое определение 'FTDI.FT_DEVICE', чтобы мы могли проверить его совместимость с DWORD (я предполагаю его перечисление, оно должно наследовать от uint32). –