【发布时间】:2017-08-25 20:12:22
【问题描述】:
C# 新手。我已经编写了一个可以工作的 WDF 驱动程序和 DLL。我正在用 C# 创建一个应用程序来通过 DLL 访问硬件。有一个特定的函数在第一次调用后不久就会导致 ExecutionEngineException。以下是 DLL 中的函数定义:
DECLDIR int ReadDatagram(int channel, unsigned long *msgID, unsigned int *msgType, int *msgLen, unsigned int *data);
在我的 C# 应用程序代码中,我使用以下行导入此函数:
[DllImport("pcmcanDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
internal static extern int ReadDatagram(int channel, ref uint msgID, ref uint msgType, ref int msgLen, uint[] data);
当我启动应用程序并打开一个频道时,这个函数会被一个计时器定期调用。在很短的不确定时间后,我收到以下异常消息。如果我注释掉他对这个函数的调用,应用程序永远不会有问题。
消息:mscorlib.dll 中出现“System.ExecutionEngineException”类型的未处理异常
我的应用程序代码在这里。我相信我正在正确处理指针参数,因为偶尔这会工作几次,并且这些数据在这些停止中是好的。欣赏任何见解。
private void rcvTimer_Tick(object sender, EventArgs e)
{
int channel = 1;
String dsplyString = "Packet Received\n";
uint msgID = 0, msgType = 0;
int msgLen = 0;
uint[] data = new uint[8];
ErrorTypes dllReturn = ErrorTypes.RCV_BUFFER_EMPTY;
do
{
dllReturn = (ErrorTypes)NativeMethods.ReadDatagram(channel, ref msgID, ref msgType, ref msgLen, data);
if (dllReturn != ErrorTypes.SUCCESS && dllReturn != ErrorTypes.RCV_BUFFER_EMPTY)
{
MessageBox.Show("Error receiving packet.", "Receipt Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
break;
}
else if (dllReturn == ErrorTypes.SUCCESS)
{
dsplyString = String.Format("{0} {1} {2} {3}\n", channel, msgID, msgType, msgLen);
}
} while (dllReturn != ErrorTypes.RCV_BUFFER_EMPTY);
}
【问题讨论】:
-
还看到了以下错误消息:mscorlib.dll 中发生了“System.AccessViolationException”类型的未处理异常附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
-
很难说你做错了什么,因为没有关于如何调用 DLL 的规范。仅仅知道参数的类型是不够的。