初心者からC#へ。私は動作するWDFドライバとDLLを書いています。私はDLLを介してハードウェアにアクセスするためにC#でアプリケーションを作成しています。最初に呼び出された直後にExecutionEngineExceptionを引き起こす特定の関数があります。ここでは、DLLから関数の定義である:私のC#アプリケーションのコードでDLLへのC#インターフェイスとExecutionEngineException
DECLDIR int ReadDatagram(int channel, unsigned long *msgID, unsigned int *msgType, int *msgLen, unsigned int *data);
が、私は次の行で、この機能をインポートします。
[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);
私は、アプリケーションを起動し、チャンネルを開くと、この機能を定期的にタイマーによって呼び出されます。不定期の短い時間が過ぎると、次の例外メッセージが表示されます。私がこの機能を呼び出すとコメントすると、アプリケーションに問題はありません。
メッセージを指定:型「System.ExecutionEngineException」の未処理の例外は、私のアプリケーションのコードはここにあるがmscorlib.dll
で発生しました。私はポインタ引数を正しく処理していると信じています。これは、時折、これが数回動作し、データがそれらの停止時に良好であるためです。任意の洞察力を感謝します。
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);
}
は、以下のエラーメッセージを見たことがあり、次の試してみてください:型「System.AccessViolationException」の未処理の例外は がmscorlib.dllで発生しました追加情報:保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。 – Paul
どのようにDLLを呼び出さなければならないかの指定がないので、間違っていることを言うのはかなり難しいです。パラメータの種類を知るだけでは不十分です。 –