我有一些依赖于内存文件的应用程序集合。我使用持久性应用程序创建它们,然后3个应用程序使用GPS,IMU和交换数据更新文件,并且3个应用程序读取当前状态并生成对伺服控制器的命令。多年来效果一直很好,但是今天,当我启动第三方c#相机控制应用程序时,由于缺少内存文件,这些应用程序失败了。
我怀疑其他应用覆盖了内存区域。有没有一种方法可以保护这些内存文件。
我在Visual Studio 2017,Win10 / 64和.net 4.6.1中
我已经包含了创建和示例读写代码-所有这些已经使用了多年。我确实将系统更新为当前的.net 4.6.1,并且没有第3方应用程序,系统运行了几个小时就没有错误。启动C#应用程序编译的应用程序后,内存文件立即消失。我无权访问源代码,并且对C#充满希望。
现在还不知道,一种解决方案是安装新的CPU并在单独的盒子上运行3rd party应用程序。我的应用程序与它之间没有通信。
I create with :
Dim LoopForever As Boolean = True
Dim AHRS_Memory_File_Name As String = "AHRSMemoryData"
Dim GPS_Memory_File_Name As String = "GPSMemoryData"
Dim Switch_Memory_File_Name As String = "SwitchMemoryData"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim MMS = MemoryMappedFile.CreateNew(Switch_Memory_File_Name, 20,
MemoryMappedFileAccess.ReadWrite)
Dim GPS = MemoryMappedFile.CreateNew(GPS_Memory_File_Name, 200,
MemoryMappedFileAccess.ReadWrite)
Dim AHRS = MemoryMappedFile.CreateNew(AHRS_Memory_File_Name, 200,
MemoryMappedFileAccess.ReadWrite)
Do Until LoopForever = False
Thread.Sleep(10000)
Loop
End Sub
A sample Write is
Sub WriteGPS_To_Memory()
Dim GPS_MMF = MemoryMappedFile.OpenExisting(GPS_Memory_File_Name)
Dim Bytes As Byte()
' This is the format of the current gps memory message
outMessage = GPSSpeedIn & "," & GPSBearing & "," & GPSLongitude & ","
& GPSLatitude & "," & GarminMagDeviationText & "," & GPSMessageCount
& "," & GPSAltitude & ","
Bytes = StrToByteArray(outMessage)
Try
Using writer = GPS_MMF.CreateViewAccessor(0, Bytes.Length)
writer.WriteArray(Of Byte)(0, Bytes, 0, Bytes.Length)
' writer.Dispose()
End Using
Catch ex As Exception
MsgBox("mem write error = " & ex.ToString)
End Try
And a sample read is
Dim MMF = MemoryMappedFile.OpenExisting(MEMS_Memory_File_Name)
Using reader = MMF.CreateViewAccessor(0, 200,
MemoryMappedFileAccess.Read)
Dim NewByteString = New Byte(200) {}
reader.ReadArray(Of Byte)(0, NewByteString, 0,
NewByteString.Length)
InMessage = Convert.ToString(NewByteString)
teststring = ""
CycleCount = CycleCount + 1
teststring = BitConverter.ToString(NewByteString)
For i As Integer = 0 To NewByteString.Length - 1
AHRS_CommDataIn =
System.Text.Encoding.ASCII.GetString(NewByteString)
Next
End Using
MMF.Dispose()
最好的结果是找到一种保护这些文件的方法。我在美国,供应商在以色列,反应不特别。
这方面存在时间压力,因为我的公司使用该软件来定位产生蚊子(讨厌那些害虫)的水体,这些蚊子散布着西尼罗河病毒,Denge和疟疾。今天,我们清理了一个300平方英里的任务,影响了约50万人。
答案 0 :(得分:0)
问题显然出在第三方软件中-我们在将问题发布到他们的支持网站的那天他们发布了更新的程序-因此我们一定不能只到存在此问题的网站