2017-08-25 18 views
1

初心者から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); 

} 
+0

は、以下のエラーメッセージを見たことがあり、次の試してみてください:型「System.AccessViolationException」の未処理の例外は がmscorlib.dllで発生しました追加情報:保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。 – Paul

+0

どのようにDLLを呼び出さなければならないかの指定がないので、間違っていることを言うのはかなり難しいです。パラメータの種類を知るだけでは不十分です。 –

答えて

-1

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 

     } 

    } 
    public enum ErrorTypes : int 
    { 
     RCV_BUFFER_EMPTY = 0, 
     SUCCESS = 1 
    } 
    public class Test 
    { 
     [DllImport("pcmcanDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 
     internal static extern int ReadDatagram(int channel, ref uint msgID, IntPtr msgType, ref int msgLen, IntPtr dataPtr); 

     private void rcvTimer_Tick(object sender, EventArgs e) 
     { 
      int channel = 1; 
      String dsplyString = "Packet Received\n"; 
      uint msgID = 0; 
      uint msgType = 0; 
      int msgLen = 0; 
      uint[] data = new uint[8]; 


      ErrorTypes dllReturn = ErrorTypes.RCV_BUFFER_EMPTY; 

      IntPtr dataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(data)); 
      IntPtr msgTypePtr = Marshal.AllocHGlobal(Marshal.SizeOf(msgType)); 
      do 
      { 
       Marshal.StructureToPtr(msgType, msgTypePtr, true); 
       Marshal.StructureToPtr(data, dataPtr, true); 
       dllReturn = (ErrorTypes)ReadDatagram(channel, ref msgID, msgTypePtr, ref msgLen, dataPtr); 


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

      Marshal.FreeHGlobal(dataPtr); 
      Marshal.FreeHGlobal(msgTypePtr); 

     } 
    } 
} 
+0

多くの間違い –

+0

あなたはコードを試していないので、どうやってそれがうまくいかないのか分かりませんか?あなたがしているのは、否定的なコメントを投稿して、本当の解決策を投稿することではありません。 – jdweng

+0

pinvokeタグで自分のレコードを見て、それが本当でないことを確認してください。 –

関連する問題