c#致命执行引擎错误调用动态加载的.dll

C# Fatal Execution Engine Error calling dynamically loaded .dll

本文关键字:动态 加载 dll 调用 错误 执行 引擎      更新时间:2023-10-16

我几周前开始用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); 

.dll中的c++头文件是这样的:

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

lib可以在这里找到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

Thanks in advance

/edit: i forgot the FT_DEVICE enum

        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
    };

谢谢大家,我现在可以运行了。我从FT_DEVICE_LIST_INFO_NODE中创建了一个结构体,并添加了LayoutKind。顺序和CharSet。Ansi属性。我也改变了FTDI。将FT_DEVICE转换为一个简单的单元,用于测试,现在似乎可以运行了。

    [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;
    }