2015-08-20 7 views
0

Я начал программирование в 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 
    }; 
+0

Ваше маршалинг не передает перезаписываемый буфер строки. См. [По умолчанию маршалинг для строк] (https://msdn.microsoft.com/en-us/library/s9ts558h%28v=vs.110%29.aspx) (особенно раздел Строковые буферы с фиксированной длиной) – theB

+0

Вы также должны добавление '[StructLayout (LayoutKind.Sequential)]' к вашему определению структуры, иначе среда выполнения может изменить элементы структуры, чтобы упаковать другой способ. –

+0

Вы также должны показать свое определение 'FTDI.FT_DEVICE', чтобы мы могли проверить его совместимость с DWORD (я предполагаю его перечисление, оно должно наследовать от uint32). –

ответ

0

Thanky вас Everone, я получил это работает в настоящее время. Я создал структуру из 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; 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^