前提・実現したいこと
現在C#で計測制御のプログラムを作成しています。
使用するのはContecのPCIe接続のアナログ入力ボードで、現物が手元にないため、
API-AIO(WDM)からDemo Deviceという仮想デバイスを用いて開発しています。
環境はVisual Studio 2015/Windows フォームアプリケーション/.Net Framework 4.6.1です。
まず取っ掛かりとして、100ミリ秒間隔で16個のテキストボックスにアナログ入力の値を表示しようとしていましたが、
20秒程度プログラムが動いたのち、以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
System.AccessViolationException
HResult=0x80004003
Message=保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
Source=System.Windows.Forms
スタック トレース:
場所 System.Windows.Forms.PropertyStore.LocateObjectEntry(Int16 entryKey, Int32& index)
場所 System.Windows.Forms.PropertyStore.GetObject(Int32 key, Boolean& found)
場所 System.Windows.Forms.Form.get_IsMdiChild()
場所 System.Windows.Forms.Form.CanRecreateHandle()
場所 System.Windows.Forms.Form.set_Active(Boolean value)
場所 System.Windows.Forms.Form.WmActivate(Message& m)
場所 System.Windows.Forms.Form.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
該当のソースコード
c#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Threading.Tasks; 5using System.Windows.Forms; 6 7namespace DigitShowBasic 8{ 9 static class Program 10 { 11 /// <summary> 12 /// アプリケーションのメイン エントリ ポイントです。 13 /// </summary> 14 [STAThread] 15 static void Main() 16 { 17 Application.EnableVisualStyles(); 18 Application.SetCompatibleTextRenderingDefault(false); 19 Application.Run(new MainForm()); // ここでエラーメッセージが発生 20 } 21 } 22}
c#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using CaioCs; 11 12namespace DigitShowBasic 13{ 14 public partial class MainForm : Form 15 { 16 Caio aio = new Caio(); 17 18 int Ret; 19 short m_Id; 20 DateTime StartTime; 21 static short ADNUM = 16; 22 int ChartPointNum = 1000; 23 int AiSamplingTimes = ADNUM; 24 float[] AiData = new float[ADNUM]; 25 26 public MainForm() 27 { 28 InitializeComponent(); 29 30 AdInitialize(); 31 } 32 33 private void AdInitialize() 34 { 35 Ret = aio.Init("Aio000", out m_Id); 36 ErrorJudge(Ret); 37 Ret = aio.SetAiInputMethod(m_Id, 0); 38 ErrorJudge(Ret); 39 Ret = aio.SetAiChannels(m_Id, ADNUM); 40 ErrorJudge(Ret); 41 Ret = aio.SetAiRangeAll(m_Id, 0); 42 ErrorJudge(Ret); 43 Ret = aio.SetAiTransferMode(m_Id, 0); 44 ErrorJudge(Ret); 45 Ret = aio.SetAiMemoryType(m_Id, 0); 46 ErrorJudge(Ret); 47 Ret = aio.SetAiClockType(m_Id, 0); 48 ErrorJudge(Ret); 49 Ret = aio.SetAiSamplingClock(m_Id, 100000); 50 ErrorJudge(Ret); 51 Ret = aio.SetAiStartTrigger(m_Id, 0); 52 ErrorJudge(Ret); 53 Ret = aio.SetAiStopTrigger(m_Id, 4); 54 ErrorJudge(Ret); 55 Ret = aio.ResetAiMemory(m_Id); 56 ErrorJudge(Ret); 57 int AiSamplingCount; 58 Ret = aio.GetAiSamplingCount(m_Id, out AiSamplingCount); 59 ErrorJudge(Ret); 60 Ret = aio.StartAi(m_Id); 61 ErrorJudge(Ret); 62 StartTime = DateTime.Now; 63 64 } 65 66 private void MainForm_Closed(object sender, FormClosedEventArgs e) 67 { 68 Ret = aio.StopAi(m_Id); 69 ErrorJudge(Ret); 70 Ret = aio.Exit(m_Id); 71 ErrorJudge(Ret); 72 } 73 74 private void timer1_Tick(object sender, EventArgs e) 75 { 76 Ret = aio.GetAiSamplingDataEx(m_Id, ref AiSamplingTimes, ref AiData); 77 CH01_textbox.Text = AiData[0].ToString("F6"); 78 CH02_textbox.Text = AiData[1].ToString("F6"); 79 CH03_textbox.Text = AiData[2].ToString("F6"); 80 CH04_textbox.Text = AiData[3].ToString("F6"); 81 CH05_textbox.Text = AiData[4].ToString("F6"); 82 CH06_textbox.Text = AiData[5].ToString("F6"); 83 CH07_textbox.Text = AiData[6].ToString("F6"); 84 CH08_textbox.Text = AiData[7].ToString("F6"); 85 CH09_textbox.Text = AiData[8].ToString("F6"); 86 CH10_textbox.Text = AiData[9].ToString("F6"); 87 CH11_textbox.Text = AiData[10].ToString("F6"); 88 CH12_textbox.Text = AiData[11].ToString("F6"); 89 CH13_textbox.Text = AiData[12].ToString("F6"); 90 CH14_textbox.Text = AiData[13].ToString("F6"); 91 CH15_textbox.Text = AiData[14].ToString("F6"); 92 CH16_textbox.Text = AiData[15].ToString("F6"); 93 } 94 95 private void ErrorJudge(int Ret) 96 { 97 if (Ret != 0) 98 { 99 string ErrorString; 100 aio.GetErrorString(Ret, out ErrorString); 101 MessageBox.Show("aio.Init = " + Ret.ToString() + " : " + ErrorString); 102 return; 103 } 104 return; 105 } 106 } 107 108} 109
試したこと
Access violationに惑わされて4時間奪われた話
こちらを参考に、「「プロジェクトのプロパティ>デバッグ>ネイティブ コードのデバッグを有効にする(T)」にチェック」をやってみたのですが、症状は変わらずでした。
補足情報(FW/ツールのバージョンなど)
teratail初質問になります。よろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー