System.IO.FileNotFoundException (Unerklärbar!)

  • VB.NET
  • .NET 5–6

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    System.IO.FileNotFoundException (Unerklärbar!)

    Moin moin
    Ich verzweifel an einer "System.IO.FileNotFoundException", weil ich einfach nicht herausfinde:

    1.) Warum diese kommt
    2.) Wer die wirft


    Das ist in .Net6 und .Net8 identisch!
    Hier mein Code der dll und eine entsprechende Debug Ausgabe:

    Spoiler anzeigen

    Der relevante Code in der DLL:

    VB.NET-Quellcode

    1. Public Class CalculatedAverages
    2. ' Singleton-Instanz, Thread-sicher durch statische Initialisierung
    3. Public Shared ReadOnly Instance As New CalculatedAverages()
    4. ' Um die monatlichen Durchschnittswerte zu speichern
    5. Private ReadOnly _monthlyAverages As New List(Of ClimaAverage)()
    6. ' Dienste laden
    7. Private ReadOnly _configHandler As ConfigHandler = ConfigHandler.Instance
    8. Private ReadOnly _propertySetter As PropertySetter = PropertySetter.Instance
    9. ' Getter für die monatlichen Durchschnittswerte
    10. Public Function GetMonthlyAverages() As List(Of ClimaAverage)
    11. Return _monthlyAverages
    12. End Function
    13. ' Summen für die Berechnungen
    14. Dim monthlyRainDay As Double = 0
    15. Dim monthlySnowDay As Double = 0
    16. Dim monthlySnowNight As Double = 0
    17. Dim monthlyHumidiMinDay As Double = 0
    18. Dim monthlyHumidiMaxDay As Double = 0
    19. Dim monthlyHumidiMinNight As Double = 0
    20. Dim monthlyHumidiMaxNight As Double = 0
    21. Dim monthlyTempDay As Double = 0
    22. Dim monthlyTempNight As Double = 0
    23. Dim monthlyWindDay As Double = 0
    24. Dim monthlyWindNight As Double = 0
    25. Dim count As Integer = 0
    26. Public Function GetXmlFiles(selectedYear As Integer, month As Integer) As List(Of String)
    27. Try
    28. ' Erstelle das Suchmuster für die Datei
    29. Dim monthPattern As String = $"{month:00}-{selectedYear}.xml"
    30. Dim directoryPath As String = _configHandler.DataDirectory
    31. Debug.WriteLine($"Suche nach Dateien mit Muster: {monthPattern} im Verzeichnis: {directoryPath}")
    32. ' Überprüfe, ob das Verzeichnis existiert
    33. If Not Directory.Exists(directoryPath) Then
    34. Throw New DirectoryNotFoundException($"Das Verzeichnis '{directoryPath}' wurde nicht gefunden.")
    35. End If
    36. ' Suche die Dateien im angegebenen Verzeichnis
    37. Dim files = Directory.GetFiles(directoryPath, monthPattern, SearchOption.TopDirectoryOnly).ToList()
    38. ' Zeige die gefundenen Dateien an
    39. If files.Any() Then
    40. Debug.WriteLine($"Gefundene Dateien: {String.Join(", ", files)}")
    41. Else
    42. Debug.WriteLine($"Keine Dateien für {monthPattern} im Verzeichnis {directoryPath} gefunden.")
    43. End If
    44. Return files
    45. Catch ex As FileNotFoundException
    46. Debug.WriteLine($"Datei nicht gefunden: {ex.Message}")
    47. Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
    48. Catch ex As DirectoryNotFoundException
    49. ' Fehlerbehandlung bei Verzeichnissuche
    50. Debug.WriteLine($"Fehler: {ex.Message}")
    51. Return Nothing
    52. Catch ex As Exception
    53. ' Allgemeine Fehlerbehandlung
    54. Debug.WriteLine($"Fehler in GetXmlFiles: {ex.Message}")
    55. Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
    56. Return Nothing
    57. End Try
    58. Return Nothing
    59. End Function
    60. Public Sub CallCalculation()
    61. Try
    62. ' Ausgabe zu Beginn der Berechnungen
    63. Debug.WriteLine("Berechnung startet...")
    64. _monthlyAverages.Clear()
    65. ' Durchlaufe alle Monate (1 bis 12)
    66. For month As Integer = 1 To 12
    67. Debug.WriteLine($"Verarbeite Monat {month} für Jahr {_propertySetter.CurrentYear}")
    68. ' Aufruf der Methode, die die XML-Dateien für den Monat zurückgibt
    69. Dim files As List(Of String) = GetXmlFiles(_propertySetter.CurrentYear, month)
    70. ' Wenn Dateien gefunden wurden, fortfahren mit der Verarbeitung
    71. If files IsNot Nothing AndAlso files.Count > 0 Then
    72. VerarbeiteMonat(files, month)
    73. Else
    74. Debug.WriteLine($"Keine Wetterdaten für {month:00}-{_propertySetter.CurrentYear} gefunden.")
    75. End If
    76. Next
    77. ' Abschluss der Berechnung
    78. Debug.WriteLine("Berechnungen abgeschlossen.")
    79. Catch ex As FileNotFoundException
    80. Debug.WriteLine($"Fehler: Datei nicht gefunden. {ex.Message}")
    81. Catch ex As UnauthorizedAccessException
    82. Debug.WriteLine($"Zugriffsfehler auf Datei: {ex.Message}")
    83. Catch ex As IOException
    84. Debug.WriteLine($"E/A Fehler beim Öffnen der Datei: {ex.Message}")
    85. Catch ex As Exception
    86. Debug.WriteLine($"Unbekannter Fehler beim Verarbeiten der Datei: {ex.Message}")
    87. Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
    88. End Try
    89. End Sub
    90. Private Sub VerarbeiteMonat(files As List(Of String), month As Integer)
    91. ' Initialisiere Zähler und Summen für den Monat
    92. ResetMonthlySummaries()
    93. ' Durchlaufe alle gefundenen Dateien
    94. For Each filename As String In files
    95. Debug.WriteLine($"Verarbeite Datei: {filename}")
    96. Try
    97. ' Überprüfe, ob die Datei existiert, bevor sie geöffnet wird
    98. If Not File.Exists(filename) Then
    99. Debug.WriteLine($"Die Datei '{filename}' existiert nicht. Aussteigen.")
    100. Exit Sub
    101. End If
    102. ' Datei öffnen und einlesen
    103. OpenXmlFile(filename)
    104. Catch ex As UnauthorizedAccessException
    105. Debug.WriteLine($"Zugriff verweigert auf Datei {filename}: {ex.Message}")
    106. Catch ex As Exception
    107. Debug.WriteLine($"Unerwarteter Fehler beim Verarbeiten der Datei {filename}: {ex.Message}")
    108. End Try
    109. Next
    110. ' Wenn Daten vorhanden sind, berechne die Durchschnittswerte
    111. If count > 0 Then
    112. BerechneUndSpeichereDurchschnittswerte(month)
    113. Else
    114. Debug.WriteLine($"Monat {month}: Keine Daten gefunden, Durchschnittswerte werden nicht berechnet.")
    115. End If
    116. End Sub
    117. Private Sub ResetMonthlySummaries()
    118. ' Setze alle Summen auf 0 zurück
    119. monthlyRainDay = 0
    120. monthlySnowDay = 0
    121. monthlySnowNight = 0
    122. monthlyHumidiMinDay = 0
    123. monthlyHumidiMaxDay = 0
    124. monthlyHumidiMinNight = 0
    125. monthlyHumidiMaxNight = 0
    126. monthlyTempDay = 0
    127. monthlyTempNight = 0
    128. monthlyWindDay = 0
    129. monthlyWindNight = 0
    130. count = 0
    131. End Sub
    132. Private Sub BerechneUndSpeichereDurchschnittswerte(month As Integer)
    133. Debug.WriteLine($"Berechne Durchschnittswerte für Monat {month}, Zähler: {count}")
    134. ' Berechne die Durchschnittswerte
    135. Dim avgRain = Math.Round(monthlyRainDay / count, 2)
    136. Dim avgSnowDay = Math.Round(monthlySnowDay / count, 2)
    137. Dim avgSnowNight = Math.Round(monthlySnowNight / count, 2)
    138. Dim avgHumidiMinDay = Math.Round(monthlyHumidiMinDay / count, 2)
    139. Dim avgHumidiMaxDay = Math.Round(monthlyHumidiMaxDay / count, 2)
    140. Dim avgHumidiMinNight = Math.Round(monthlyHumidiMinNight / count, 2)
    141. Dim avgHumidiMaxNight = Math.Round(monthlyHumidiMaxNight / count, 2)
    142. Dim avgTempDay = Math.Round(monthlyTempDay / count, 2)
    143. Dim avgTempNight = Math.Round(monthlyTempNight / count, 2)
    144. Dim avgWindDay = Math.Round(monthlyWindDay / count, 2)
    145. Dim avgWindNight = Math.Round(monthlyWindNight / count, 2)
    146. ' Füge die berechneten Durchschnittswerte zur Liste hinzu
    147. _monthlyAverages.Add(New ClimaAverage() With {
    148. .Period = month,
    149. .AverageRain = avgRain,
    150. .AverageSnowDay = avgSnowDay,
    151. .AverageSnowNight = avgSnowNight,
    152. .AverageHumidiMinDay = avgHumidiMinDay,
    153. .AverageHumidiMaxDay = avgHumidiMaxDay,
    154. .AverageHumidiMinNight = avgHumidiMinNight,
    155. .AverageHumidiMaxNight = avgHumidiMaxNight,
    156. .AverageTempDay = avgTempDay,
    157. .AverageTempNight = avgTempNight,
    158. .AverageWindDay = avgWindDay,
    159. .AverageWindNight = avgWindNight
    160. })
    161. Debug.WriteLine($"Durchschnittswerte für Monat {month}: Regen {avgRain}")
    162. End Sub
    163. Private Sub OpenXmlFile(newfileName As String)
    164. Try
    165. ' Versuche die Datei zu öffnen, mit FileShare.ReadWrite, um parallelen Zugriff zu erlauben
    166. Using fs As New FileStream(newfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
    167. Debug.WriteLine($"Öffne Datei: {newfileName}")
    168. ' Deserialisiere die Wetterdaten aus der XML-Datei
    169. Dim serializer As New XmlSerializer(GetType(WeatherDataArray))
    170. Dim data As WeatherDataArray
    171. ' Überprüfe, ob die Datei korrekt deserialisiert werden kann
    172. Try
    173. data = CType(serializer.Deserialize(fs), WeatherDataArray)
    174. Catch ex As InvalidOperationException
    175. ' Fehler beim Deserialisieren der Datei
    176. Debug.WriteLine($"Fehler beim Deserialisieren der Datei {newfileName}: {ex.Message}")
    177. Return
    178. End Try
    179. ' Überprüfe, ob Daten in der Datei enthalten sind
    180. If data.Count > 0 Then
    181. count += data.Count
    182. Debug.WriteLine($"Deserialisierte {data.Count} Einträge aus der Datei {newfileName}.")
    183. ' Summiere die Werte für alle relevanten Parameter
    184. Dim rainSum As Double = CDbl(data.Sum(Function(wd) wd.RainDay))
    185. Dim snowDaySum As Double = CDbl(data.Sum(Function(wd) wd.SnowDay))
    186. Dim snowNightSum As Double = CDbl(data.Sum(Function(wd) wd.SnowNight))
    187. Dim humidiMinDaySum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMinDay))
    188. Dim humidiMaxDaySum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMaxDay))
    189. Dim humidiMinNightSum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMinNight))
    190. Dim humidiMaxNightSum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMaxNight))
    191. Dim tempDaySum As Double = CDbl(data.Sum(Function(wd) wd.TempDay))
    192. Dim tempNightSum As Double = CDbl(data.Sum(Function(wd) wd.TempNight))
    193. Dim windDaySum As Double = CDbl(data.Sum(Function(wd) wd.WindDay))
    194. Dim windNightSum As Double = CDbl(data.Sum(Function(wd) wd.WindNight))
    195. ' Summiere die Werte auf Monatsebene
    196. monthlyRainDay += rainSum
    197. monthlySnowDay += snowDaySum
    198. monthlySnowNight += snowNightSum
    199. monthlyHumidiMinDay += humidiMinDaySum
    200. monthlyHumidiMaxDay += humidiMaxDaySum
    201. monthlyHumidiMinNight += humidiMinNightSum
    202. monthlyHumidiMaxNight += humidiMaxNightSum
    203. monthlyTempDay += tempDaySum
    204. monthlyTempNight += tempNightSum
    205. monthlyWindDay += windDaySum
    206. monthlyWindNight += windNightSum
    207. Else
    208. Debug.WriteLine($"Keine Wetterdaten in Datei {newfileName} gefunden.")
    209. End If
    210. End Using
    211. Catch ex As FileNotFoundException
    212. Debug.WriteLine($"Fehler: Datei '{newfileName}' nicht gefunden. {ex.Message}")
    213. Catch ex As UnauthorizedAccessException
    214. Debug.WriteLine($"Zugriffsfehler auf Datei '{newfileName}': {ex.Message}")
    215. Catch ex As IOException
    216. Debug.WriteLine($"E/A Fehler beim Öffnen der Datei '{newfileName}': {ex.Message}")
    217. Catch ex As Exception
    218. Debug.WriteLine($"Unbekannter Fehler beim Verarbeiten der Datei '{newfileName}': {ex.Message}")
    219. Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
    220. End Try
    221. End Sub
    222. End Class


    Die Debugausgaben in dem kleinen Testprogramm

    XML-Quellcode

    1. Berechnung startet...
    2. Verarbeite Monat 1 für Jahr 2023
    3. Suche nach Dateien mit Muster: 01-2023.xml im Verzeichnis: C:\Users\Nyxalor\AppData\Local\Zephyros\Data
    4. Gefundene Dateien: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\01-2023.xml
    5. Verarbeite Datei: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\01-2023.xml
    6. Öffne Datei: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\01-2023.xml
    7. Ausnahme ausgelöst: "System.IO.FileNotFoundException" in System.Private.CoreLib.dll
    8. Ausnahme ausgelöst: "System.IO.FileNotFoundException" in System.Private.CoreLib.dll
    9. Deserialisierte 31 Einträge aus der Datei C:\Users\Nyxalor\AppData\Local\Zephyros\Data\01-2023.xml.
    10. Berechne Durchschnittswerte für Monat 1, Zähler: 31
    11. Durchschnittswerte für Monat 1: Regen 3,19
    12. Verarbeite Monat 2 für Jahr 2023
    13. Suche nach Dateien mit Muster: 02-2023.xml im Verzeichnis: C:\Users\Nyxalor\AppData\Local\Zephyros\Data
    14. Gefundene Dateien: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\02-2023.xml
    15. Verarbeite Datei: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\02-2023.xml
    16. Öffne Datei: C:\Users\Nyxalor\AppData\Local\Zephyros\Data\02-2023.xml
    17. Deserialisierte 28 Einträge aus der Datei C:\Users\Nyxalor\AppData\Local\Zephyros\Data\02-2023.xml.
    18. Berechne Durchschnittswerte für Monat 2, Zähler: 28
    19. Durchschnittswerte für Monat 2: Regen 1,99
    20. Verarbeite Monat 3 für Jahr 2023
    21. Suche nach Dateien mit Muster: 03-2023.xml im Verzeichnis: C:\Users\Nyxalor\AppData\Local\Zephyros\Data
    22. Keine Dateien für 03-2023.xml im Verzeichnis C:\Users\Nyxalor\AppData\Local\Zephyros\Data gefunden.
    23. Keine Wetterdaten für 03-2023 gefunden.
    24. ......
    25. ===> Bewust nur 2 XML-Files im Verzeichnis !!
    26. ................
    27. Verarbeite Monat 12 für Jahr 2023
    28. Suche nach Dateien mit Muster: 12-2023.xml im Verzeichnis: C:\Users\Nyxalor\AppData\Local\Zephyros\Data
    29. Keine Dateien für 12-2023.xml im Verzeichnis C:\Users\Nyxalor\AppData\Local\Zephyros\Data gefunden.
    30. Keine Wetterdaten für 12-2023 gefunden.
    31. Berechnungen abgeschlossen.


    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie 1.) Weil offensichtlich eine Datei nicht gefunden wurde.
    2.) Setze auf die Debug.WriteLine()-Zeile einen Haltepunkt und sieh Dir im Parameter ex den StackTrace an, da sollte die Zeile erkennbar sein, wo die Exception geworfen wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    zu 1.) => Ja aber die Datei wird doch gefunden und auch berechnet!
    zu 2.) => bei welchem denn?
    Ich habe schon mit Halte punkten versucht, aber irgendwie raffe ich das nicht mit Haltepunkten in einer DLL ?(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @RodFromGermany @Morrison

    Aus dem Beitrag bei StackOverflow werde ich nicht so richtig schlau. ;(

    Ich habe nun mal den ganzen Code der dll sehr vereinfacht:

    Die neue Meldung kommt wenn ich unter: Exception Settings die FileNotFoundException unter Common Language Runtime Exceptions den Haken setze! Ohne den Haken kommt zwar die Ausnahme, aber die Berechungen usw funktionieren.

    Meldung:
    Datei erfolgreich geöffnet: A:\Zephyros\Data\02-2023.xml
    Ausnahme ausgelöst: "System.IO.FileNotFoundException" in System.Private.CoreLib.dll
    Could not load file or assembly 'MetoeSenseLib.XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, processorArchitecture=AMD64'. Das System kann die angegebene Datei nicht finden.

    System.IO.FileNotFoundException
    HResult=0x80070002
    Nachricht = Could not load file or assembly 'MetoeSenseLib.XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, processorArchitecture=AMD64'. Das System kann die angegebene Datei nicht finden.
    Quelle = <Die Ausnahmequelle kann nicht ausgewertet werden.>
    Stapelüberwachung:
    <Die Ausnahmestapelüberwachung kann nicht ausgewertet werden.>

    Spoiler anzeigen

    In der DLL:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Xml.Serialization
    3. Public Sub OpenXmlFile(newfileName As String)
    4. Try
    5. ' Datei mit File.Open öffnen
    6. Using fs As FileStream = File.Open(newfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
    7. Debug.WriteLine($"Datei erfolgreich geöffnet: {newfileName}")
    8. ' Deserialisierung der Wetterdaten
    9. Dim serializer As New XmlSerializer(GetType(WeatherDataArray))
    10. Dim data As WeatherDataArray
    11. data = CType(serializer.Deserialize(fs), WeatherDataArray)
    12. ' Berechnungen und andere Verarbeitungen
    13. If data IsNot Nothing AndAlso data.Count > 0 Then
    14. Debug.WriteLine($"Deserialisierte {data.Count} Einträge aus der Datei {newfileName}.")
    15. ' Berechnungen
    16. Dim rainSum As Double = CDbl(data.Sum(Function(wd) wd.RainDay))
    17. Dim snowDaySum As Double = CDbl(data.Sum(Function(wd) wd.SnowDay))
    18. Dim snowNightSum As Double = CDbl(data.Sum(Function(wd) wd.SnowNight))
    19. Dim humidiMinDaySum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMinDay))
    20. Dim humidiMaxDaySum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMaxDay))
    21. Dim humidiMinNightSum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMinNight))
    22. Dim humidiMaxNightSum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMaxNight))
    23. Dim tempDaySum As Double = CDbl(data.Sum(Function(wd) wd.TempDay))
    24. Dim tempNightSum As Double = CDbl(data.Sum(Function(wd) wd.TempNight))
    25. Dim windDaySum As Double = CDbl(data.Sum(Function(wd) wd.WindDay))
    26. Dim windNightSum As Double = CDbl(data.Sum(Function(wd) wd.WindNight))
    27. ' Berechnung der monatlichen Summen
    28. monthlyRainDay += rainSum
    29. monthlySnowDay += snowDaySum
    30. monthlySnowNight += snowNightSum
    31. monthlyHumidiMinDay += humidiMinDaySum
    32. monthlyHumidiMaxDay += humidiMaxDaySum
    33. monthlyHumidiMinNight += humidiMinNightSum
    34. monthlyHumidiMaxNight += humidiMaxNightSum
    35. monthlyTempDay += tempDaySum
    36. monthlyTempNight += tempNightSum
    37. monthlyWindDay += windDaySum
    38. monthlyWindNight += windNightSum
    39. ' Berechnung der Durchschnittswerte
    40. Dim avgRain As Double = rainSum / data.Count
    41. Dim avgTempDay As Double = tempDaySum / data.Count
    42. Dim avgTempNight As Double = tempNightSum / data.Count
    43. Dim avgWindDay As Double = windDaySum / data.Count
    44. Dim avgWindNight As Double = windNightSum / data.Count
    45. Dim avgHumidiMinDay As Double = humidiMinDaySum / data.Count
    46. Dim avgHumidiMaxDay As Double = humidiMaxDaySum / data.Count
    47. Dim avgHumidiMinNight As Double = humidiMinNightSum / data.Count
    48. Dim avgHumidiMaxNight As Double = humidiMaxNightSum / data.Count
    49. Dim avgSnowDay As Double = snowDaySum / data.Count
    50. Dim avgSnowNight As Double = snowNightSum / data.Count
    51. ' Debug-Ausgabe der berechneten Werte
    52. Debug.WriteLine($"Berechnungen abgeschlossen für {newfileName}:")
    53. Debug.WriteLine($"Regen: {avgRain} / Schnee Tag: {avgSnowDay} / Schnee Nacht: {avgSnowNight}")
    54. Debug.WriteLine($"Min. Luftfeuchtigkeit Tag: {avgHumidiMinDay} / Max. Luftfeuchtigkeit Tag: {avgHumidiMaxDay}")
    55. Debug.WriteLine($"Min. Luftfeuchtigkeit Nacht: {avgHumidiMinNight} / Max. Luftfeuchtigkeit Nacht: {avgHumidiMaxNight}")
    56. Debug.WriteLine($"Temp. Tag: {avgTempDay} / Temp. Nacht: {avgTempNight}")
    57. Debug.WriteLine($"Wind Tag: {avgWindDay} / Wind Nacht: {avgWindNight}")
    58. Else
    59. Debug.WriteLine($"Keine Wetterdaten in Datei {newfileName} gefunden.")
    60. End If
    61. End Using
    62. Catch ex As FileNotFoundException
    63. Debug.WriteLine($"Fehler: Datei '{newfileName}' nicht gefunden. {ex.Message}")
    64. Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
    65. Catch ex As UnauthorizedAccessException
    66. Debug.WriteLine($"Zugriffsfehler auf Datei '{newfileName}': {ex.Message}")
    67. Catch ex As IOException
    68. Debug.WriteLine($"E/A Fehler beim Öffnen der Datei '{newfileName}': {ex.Message}")
    69. Catch ex As Exception
    70. Debug.WriteLine($"Unbekannter Fehler beim Verarbeiten der Datei '{newfileName}': {ex.Message}")
    71. Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
    72. End Try
    73. End Sub


    In der TestAnwendung:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Xml.Serialization
    3. Imports MetoeSenseLib
    4. Public Class Form1
    5. ' Dienst-Aufruf aus der DLL Numora
    6. Private ReadOnly _avgCalculation As CalculatedAverages = CalculatedAverages.Instance
    7. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. Dim file As String = "A:\Zephyros\Data\02-2023.xml"
    9. _avgCalculation.OpenXmlFile(file)
    10. End Sub




    Debug Ohne den Haken bei den EInstellungen:
    Datei erfolgreich geöffnet: A:\Zephyros\Data\02-2023.xml
    Ausnahme ausgelöst: "System.IO.FileNotFoundException" in System.Private.CoreLib.dll
    Ausnahme ausgelöst: "System.IO.FileNotFoundException" in System.Private.CoreLib.dll
    Deserialisierte 28 Einträge aus der Datei A:\Zephyros\Data\02-2023.xml.
    Berechnungen abgeschlossen für A:\Zephyros\Data\02-2023.xml:
    Regen: 1,9928571428571424 / Schnee Tag: 0 / Schnee Nacht: 0
    Min. Luftfeuchtigkeit Tag: 68,53571428571429 / Max. Luftfeuchtigkeit Tag: 87,64285714285714
    Min. Luftfeuchtigkeit Nacht: 78,39285714285714 / Max. Luftfeuchtigkeit Nacht: 94,17857142857143
    Temp. Tag: 9,478571428571428 / Temp. Nacht: 2,7321428571428577
    Wind Tag: 3,4285714285714284 / Wind Nacht: 3,4285714285714284
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Coldfire
    Nein die XML-Dateien enthalten nur Daten:
    Gekürtzte XML

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <ArrayOfWeatherData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <WeatherData>
    4. <WeatherDate>2023-01-01T00:00:00+01:00</WeatherDate>
    5. <RainDay>1.6</RainDay>
    6. </WeatherData>

    Und das für jeden Tag des Monat. Jeder Monat hat eine XML-Datei!

    Das auslesen und berechnen funktioniert JA. Es kommt halt immer diese seltsame Ausnahme.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Could not load file or assembly 'MetoeSenseLib.XmlSerializers

    Hast du da irgendwo einen Schreibfehler und es müsste MeteoSenseLib heißen?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    So nochmal ein sauberes Projekt gemacht. Dann die DLL für .Net6 und 4.6.1 kompiliert!!!

    Das Ergebnis siehe hier. Ich kapiere das nicht. Scheinbar will .Net6 irgendwas haben aber ich checke es nicht. :S

    Spoiler anzeigen


    XML-Quellcode

    1. <Project Sdk="Microsoft.NET.Sdk">
    2. <PropertyGroup>
    3. <RootNamespace>Numora</RootNamespace>
    4. <TargetFrameworks>net6.0;net461</TargetFrameworks>
    5. <OptionStrict>On</OptionStrict>
    6. <ApplicationManifest>My Project\app.manifest</ApplicationManifest>
    7. </PropertyGroup>



    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Xml.Serialization
    3. Public Class CalculatedAverages
    4. ' Singleton-Instanz, Thread-sicher durch statische Initialisierung
    5. Public Shared ReadOnly Instance As New CalculatedAverages()
    6. ' Um die monatlichen Durchschnittswerte zu speichern
    7. Private ReadOnly _monthlyAverages As New List(Of ClimaAverage)()
    8. ' Dienste laden
    9. Private ReadOnly _configServiceInstance As ConfigService = ConfigService.Instance
    10. ' Getter für die monatlichen Durchschnittswerte
    11. Public Function GetMonthlyAverages() As List(Of ClimaAverage)
    12. Return _monthlyAverages
    13. End Function
    14. Public Function GetXmlFiles(selectedYear As Integer, month As Integer) As List(Of String)
    15. Try
    16. ' Erstelle das Suchmuster für die Datei
    17. Dim monthPattern As String = $"{month:00}-{selectedYear}.xml"
    18. Dim directoryPath As String = _configServiceInstance.DataDirectory
    19. Debug.WriteLine($"Suche nach Dateien mit Muster: {monthPattern} im Verzeichnis: {directoryPath}")
    20. ' Überprüfe, ob das Verzeichnis existiert
    21. If Not Directory.Exists(directoryPath) Then
    22. Throw New DirectoryNotFoundException($"Das Verzeichnis '{directoryPath}' wurde nicht gefunden.")
    23. End If
    24. ' Suche die Dateien im angegebenen Verzeichnis
    25. Dim files = Directory.GetFiles(directoryPath, monthPattern, SearchOption.TopDirectoryOnly).ToList()
    26. ' Zeige die gefundenen Dateien an
    27. If files.Any() Then
    28. Debug.WriteLine($"Gefundene Dateien: {String.Join(", ", files)}")
    29. Else
    30. Debug.WriteLine($"Keine Dateien für {monthPattern} im Verzeichnis {directoryPath} gefunden.")
    31. End If
    32. Return files
    33. Catch ex As DirectoryNotFoundException
    34. ' Fehlerbehandlung bei Verzeichnissuche
    35. Debug.WriteLine($"Fehler: {ex.Message}")
    36. Return Nothing
    37. Catch ex As Exception
    38. ' Allgemeine Fehlerbehandlung
    39. Debug.WriteLine($"Fehler in GetXmlFiles: {ex.Message}")
    40. Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
    41. Return Nothing
    42. End Try
    43. End Function
    44. Public Sub CallCalculation()
    45. ' Ausgabe zu Beginn der Berechnungen
    46. Debug.WriteLine("Berechnung startet...")
    47. _monthlyAverages.Clear()
    48. ' Durchlaufe alle Monate (1 bis 12)
    49. For month As Integer = 1 To 12
    50. Debug.WriteLine($"Verarbeite Monat {month} für Jahr {_configServiceInstance.CurrentYear}")
    51. ' Aufruf der Methode, die die XML-Dateien für den Monat zurückgibt
    52. Dim files As List(Of String) = GetXmlFiles(_configServiceInstance.CurrentYear, month)
    53. ' Wenn Dateien gefunden wurden, fortfahren mit der Verarbeitung
    54. If files IsNot Nothing AndAlso files.Count > 0 Then
    55. ' Summen für die Berechnungen
    56. Dim monthlyRainDay As Double = 0
    57. Dim monthlySnowDay As Double = 0
    58. Dim monthlySnowNight As Double = 0
    59. Dim monthlyHumidiMinDay As Double = 0
    60. Dim monthlyHumidiMaxDay As Double = 0
    61. Dim monthlyHumidiMinNight As Double = 0
    62. Dim monthlyHumidiMaxNight As Double = 0
    63. Dim monthlyTempDay As Double = 0
    64. Dim monthlyTempNight As Double = 0
    65. Dim monthlyWindDay As Double = 0
    66. Dim monthlyWindNight As Double = 0
    67. Dim count As Integer = 0
    68. ' Durchlaufe alle gefundenen Dateien
    69. For Each filename As String In files
    70. Debug.WriteLine($"Verarbeite Datei: {filename}")
    71. Try
    72. ' Überprüfe, ob die Datei existiert, bevor sie geöffnet wird
    73. If Not File.Exists(filename) Then
    74. Debug.WriteLine($"Die Datei '{filename}' existiert nicht.")
    75. Continue For
    76. End If
    77. ' Deserialisiere die Wetterdaten aus der XML-Datei
    78. Dim serializer As New XmlSerializer(GetType(WeatherDataArray))
    79. Using fs As New FileStream(filename, FileMode.Open)
    80. Debug.WriteLine($"Öffne Datei: {filename}")
    81. Dim data As WeatherDataArray = CType(serializer.Deserialize(fs), WeatherDataArray)
    82. ' Überprüfe, ob Daten vorhanden sind
    83. If data.Count > 0 Then
    84. count += data.Count
    85. Debug.WriteLine($"Deserialisierte {data.Count} Einträge aus der Datei {filename}.")
    86. ' Summiere die Werte für alle relevanten Parameter
    87. Dim rainSum As Double = CDbl(data.Sum(Function(wd) wd.RainDay))
    88. Dim snowDaySum As Double = CDbl(data.Sum(Function(wd) wd.SnowDay))
    89. Dim snowNightSum As Double = CDbl(data.Sum(Function(wd) wd.SnowNight))
    90. Dim humidiMinDaySum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMinDay))
    91. Dim humidiMaxDaySum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMaxDay))
    92. Dim humidiMinNightSum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMinNight))
    93. Dim humidiMaxNightSum As Double = CDbl(data.Sum(Function(wd) wd.HumidiMaxNight))
    94. Dim tempDaySum As Double = CDbl(data.Sum(Function(wd) wd.TempDay))
    95. Dim tempNightSum As Double = CDbl(data.Sum(Function(wd) wd.TempNight))
    96. Dim windDaySum As Double = CDbl(data.Sum(Function(wd) wd.WindDay))
    97. Dim windNightSum As Double = CDbl(data.Sum(Function(wd) wd.WindNight))
    98. ' Summiere die Werte auf Monatsebene
    99. monthlyRainDay += rainSum
    100. monthlySnowDay += snowDaySum
    101. monthlySnowNight += snowNightSum
    102. monthlyHumidiMinDay += humidiMinDaySum
    103. monthlyHumidiMaxDay += humidiMaxDaySum
    104. monthlyHumidiMinNight += humidiMinNightSum
    105. monthlyHumidiMaxNight += humidiMaxNightSum
    106. monthlyTempDay += tempDaySum
    107. monthlyTempNight += tempNightSum
    108. monthlyWindDay += windDaySum
    109. monthlyWindNight += windNightSum
    110. Else
    111. Debug.WriteLine($"Keine Wetterdaten in Datei {filename} gefunden.")
    112. End If
    113. End Using
    114. Catch ex As Exception
    115. ' Fehlerbehandlung bei Dateioperationen
    116. Debug.WriteLine($"Fehler beim Verarbeiten der Datei {filename}: {ex.Message}")
    117. Debug.WriteLine($"Stacktrace: {ex.StackTrace}")
    118. ' Um die Ausnahme weiter zu analysieren, gebe noch die genaue Art des Fehlers aus
    119. If TypeOf ex Is FileNotFoundException Then
    120. Debug.WriteLine($"Datei nicht gefunden: {filename}")
    121. End If
    122. End Try
    123. Next
    124. ' Wenn Daten vorhanden sind, berechne die Durchschnittswerte
    125. If count > 0 Then
    126. Debug.WriteLine($"Berechne Durchschnittswerte für Monat {month}, Zähler: {count}")
    127. Dim avgRain = Math.Round(monthlyRainDay / count, 2)
    128. Dim avgSnowDay = Math.Round(monthlySnowDay / count, 2)
    129. Dim avgSnowNight = Math.Round(monthlySnowNight / count, 2)
    130. Dim avgHumidiMinDay = Math.Round(monthlyHumidiMinDay / count, 2)
    131. Dim avgHumidiMaxDay = Math.Round(monthlyHumidiMaxDay / count, 2)
    132. Dim avgHumidiMinNight = Math.Round(monthlyHumidiMinNight / count, 2)
    133. Dim avgHumidiMaxNight = Math.Round(monthlyHumidiMaxNight / count, 2)
    134. Dim avgTempDay = Math.Round(monthlyTempDay / count, 2)
    135. Dim avgTempNight = Math.Round(monthlyTempNight / count, 2)
    136. Dim avgWindDay = Math.Round(monthlyWindDay / count, 2)
    137. Dim avgWindNight = Math.Round(monthlyWindNight / count, 2)
    138. ' Füge die berechneten Durchschnittswerte zur Liste hinzu
    139. _monthlyAverages.Add(New ClimaAverage() With {
    140. .Period = month,
    141. .AverageRain = avgRain,
    142. .AverageSnowDay = avgSnowDay,
    143. .AverageSnowNight = avgSnowNight,
    144. .AverageHumidiMinDay = avgHumidiMinDay,
    145. .AverageHumidiMaxDay = avgHumidiMaxDay,
    146. .AverageHumidiMinNight = avgHumidiMinNight,
    147. .AverageHumidiMaxNight = avgHumidiMaxNight,
    148. .AverageTempDay = avgTempDay,
    149. .AverageTempNight = avgTempNight,
    150. .AverageWindDay = avgWindDay,
    151. .AverageWindNight = avgWindNight
    152. })
    153. Debug.WriteLine($"Durchschnittswerte für Monat {month}: Regen {avgRain}, Schnee (Tag) {avgSnowDay}, Schnee (Nacht) {avgSnowNight}, " &
    154. $"Temp (Tag) {avgTempDay}, Temp (Nacht) {avgTempNight}, Wind (Tag) {avgWindDay}, Wind (Nacht) {avgWindNight}")
    155. Else
    156. Debug.WriteLine($"Monat {month}: Keine Daten gefunden, Durchschnittswerte werden nicht berechnet.")
    157. End If
    158. Else
    159. Debug.WriteLine($"Keine Wetterdaten für {month:00}-{_configServiceInstance.CurrentYear} gefunden.")
    160. End If
    161. Next
    162. ' Abschluss der Berechnung
    163. Debug.WriteLine("Berechnungen abgeschlossen.")
    164. End Sub
    165. End Class



    Die Debug-Ausgaben:
    DLL in .Net 6 kompiliert mit .Net6 Test-Anwendung

    XML-Quellcode

    1. Berechnung startet...
    2. Verarbeite Monat 1 für Jahr 2024
    3. Suche nach Dateien mit Muster: 01-2024.xml im Verzeichnis: A:\Zephyros\Data\
    4. Gefundene Dateien: A:\Zephyros\Data\01-2024.xml
    5. Verarbeite Datei: A:\Zephyros\Data\01-2024.xml
    6. Ausnahme ausgelöst: "System.IO.FileNotFoundException" in System.Private.CoreLib.dll
    7. Ausnahme ausgelöst: "System.IO.FileNotFoundException" in System.Private.CoreLib.dll
    8. Öffne Datei: A:\Zephyros\Data\01-2024.xml
    9. Deserialisierte 31 Einträge aus der Datei A:\Zephyros\Data\01-2024.xml.
    10. Berechne Durchschnittswerte für Monat 1, Zähler: 31
    11. Durchschnittswerte für Monat 1: Regen 2,54, Schnee (Tag) 0,65, Schnee (Nacht) 0,19, Temp (Tag) 5,9, Temp (Nacht) 1,08, Wind (Tag) 4,03, Wind (Nacht) 4,35


    DLL in .Net 4.6.1 kompiliert mit .Net 4.6.1 Test-Anwendung

    XML-Quellcode

    1. Berechnung startet...
    2. Verarbeite Monat 1 für Jahr 2024
    3. Suche nach Dateien mit Muster: 01-2024.xml im Verzeichnis: A:\Zephyros\Data\
    4. Gefundene Dateien: A:\Zephyros\Data\01-2024.xml
    5. Verarbeite Datei: A:\Zephyros\Data\01-2024.xml
    6. Öffne Datei: A:\Zephyros\Data\01-2024.xml
    7. Deserialisierte 31 Einträge aus der Datei A:\Zephyros\Data\01-2024.xml.
    8. Berechne Durchschnittswerte für Monat 1, Zähler: 31
    9. Durchschnittswerte für Monat 1: Regen 2,54, Schnee (Tag) 0,65, Schnee (Nacht) 0,19, Temp (Tag) 5,9, Temp (Nacht) 1,08, Wind (Tag) 4,03, Wind (Nacht) 4,35
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Ich habe schon mit Halte punkten versucht, aber irgendwie raffe ich das nicht mit Haltepunkten in einer DLL


    Ich gehe jetzt davon aus das du 2 verschiedene Solutions hast.

    Als erstes entferne den Verweis auf die DLL.
    Rechtsklick im Projektmappen-Explorer ganz oben auf Projektmappe->Hinzufügen->Vorhandenes Projekt und die Projektdatei(vbproj/csproj) auswählen.
    Nun kannst du in dieser Studioinstanz(bzw. in dieser Projektmappe) das DLL-Projekt nutzen und der Debugger hängt dann auch dran(tut er zwar auch wenn nur die DLL geladen ist, aber die haltepunkte hast du ja inner anderen Studioinstanz da interagiert der Debugger nicht mit). Beachte das die Dateien des originalen Projektes bearbeitet werden, kein dublikat! So kannste auch Haltepunkte setzen, du referenzierst so also das Projekt der DLL anstatt die DLL selbst.

    Um das Projekt wieder aus der Projektmappe heraus zubekommen, rechtsklicks auf das Projekt ->Aus der Projektmappe entfernen, dann aber wieder auf die DLL verweisen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „DTF“ ()

    Moin moin zusammen

    @petaod
    Da war zwar ein Tippfehler aber daran hat es nicht gelegen.

    @DTF
    Ich habe das mal versucht, muss dann aber trotzdem einen verweis zu dll machen, und dann bekomme ich das mit den Haltepunkten nicht gebacken.

    Es hat wohl irgendwas mit den neuen Praktiken in .Net (kein FW) zu tun, wie das mit dem "Derialisiren" vonstatten geht.
    Beim kompilieren wird versucht eine "MetoeSenseLib.XmlSerializers.dll" zu erstellen, die es dann aber nicht gibt. Das hat dann irgendwas mit den Einstellungen (siehe Bild) zu tun, was ich aber nicht kapiere.

    Fazit: Die Ausnahme kommt zwar bei .Net 6 / 7 / 8 aber die Anwendung läuft stabil weiter. In .Net 4.6.+ ist das eben nicht der Fall mit dieser Ausnahme.

    Jetzt ist natürlich die Überlegung das ganze im stabileren .Net4.8 oder mit dem Risiko .Net6 / 8 :?:
    Bilder
    • deser-1.jpg

      194,59 kB, 856×536, 20 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Moin moin

    Also ich habe das ganze Problem noch eine weile verfolgt und dann habe ich dieses ganzen Mist mit dem XmlSerializer verworfen!
    Bin auf eine andere Art herangegangen.
    Resultat: Sowohl unter .Net 4.6x - 4.8x als auch unter .Net 6 funktioniert die hier gezeigte Methode.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class WeatherDataReader
    2. Public Shared Function ReadWeatherData(month As Integer, year As Integer) As WeatherDataArray
    3. ' Pfad zur XML-Datei basierend auf Monat und Jahr
    4. Dim filePath As String = Path.Combine(Configuration.Instance.DataDirectory, $"{month:00}-{year}.xml")
    5. Debug.WriteLine($"DLL Auswahl: {month}-{year}")
    6. Debug.WriteLine($"Pfad: {filePath}")
    7. ' Überprüfen, ob die Datei existiert
    8. If Not File.Exists(filePath) Then
    9. ' Wenn die Datei nicht existiert, wird eine benutzerdefinierte Ausnahme ausgelöst
    10. Throw New WeatherDataFileNotFoundException($"Die Datei {filePath} wurde nicht gefunden.")
    11. End If
    12. ' Instanziierung des Objekts für die Wetterdaten
    13. Dim weatherDataArray As New WeatherDataArray()
    14. ' XML-Dokument laden
    15. Dim xmlDoc As New XmlDocument()
    16. Try
    17. ' Die XML-Datei in das XmlDocument laden
    18. xmlDoc.Load(filePath)
    19. ' Durchlaufe alle WeatherData-Elemente in der XML-Datei
    20. For Each node As XmlNode In xmlDoc.SelectNodes("//WeatherData")
    21. ' Erstelle ein neues WeatherData-Objekt
    22. Dim data As New WeatherData()
    23. ' Fülle die Eigenschaften des WeatherData-Objekts mit den Werten aus der XML
    24. data.WeatherDate = DateTime.Parse(node.SelectSingleNode("WeatherDate").InnerText)
    25. data.WeatherDay = node.SelectSingleNode("WeatherDay").InnerText
    26. data.WeatherNight = node.SelectSingleNode("WeatherNight").InnerText
    27. data.RainDay = Convert.ToDouble(node.SelectSingleNode("RainDay").InnerText)
    28. ' Füge das WeatherData-Objekt zum Array hinzu
    29. weatherDataArray.Add(data)
    30. Next
    31. Catch ex As Exception
    32. ' Fehler beim Laden oder Parsen des XMLs
    33. Throw New Exception("Fehler beim Verarbeiten der Wetterdaten.", ex)
    34. End Try
    35. ' Rückgabe der Wetterdaten
    36. Return weatherDataArray
    37. End Function
    38. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: