c#致命执行引擎错误调用动态加载的.dll
C# Fatal Execution Engine Error calling dynamically loaded .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);
.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;
}
相关文章:
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 在 Linux 平台的 C++ 中动态加载 DLL
- 在Qt C++单元测试中动态加载QQuickWindow而不是QQuickWidget
- 从动态加载的 dll 内部调用C++函数
- C/C++函数动态加载器(helper)
- 从动态加载的库中记录日志
- 如何将LLDB附加到C# .NET进程并调试动态加载的macOS捆绑包?
- 如何动态加载和调用具有特定于库的类型作为函数参数的符号
- OpenGL 中的动态加载着色器毫无意义吗?
- 使用动态加载库时静态变量为空
- 在动态加载的位置无关的可执行文件中分离错误
- ASAN 检测与动态加载库共享的类的 vtable 的 ODR 违规
- 运行时动态加载库时出错"unresolved external symbol"
- 使用dlopen动态加载共享库
- LDD可执行OUPUT中没有动态加载库
- 调试Android Studio中动态加载的本机库
- C++ 动态加载 DLL 错误
- 动态加载库和运行时误解的显式链接
- 通过在C 中动态加载的LIB分配的基础级指针上调用删除的安全性
- mbed uvisor 动态加载二进制文件