Windows Forms Anwendung auf Raspberry Pi ausführen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    Windows Forms Anwendung auf Raspberry Pi ausführen

    Guten Morgen,

    ich habe VS Community 2015 und einen Raspberry Pi mit Windows 10 IOT. Ich möchte den Raspberry Pi nutzen um Börsenkurse zu überwachen. Ich habe folgende funktionstüchtige Windows Forms Anwendung geschrieben:

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.IO
    3. Public Class Form1
    4. Private Prices As List(Of Single) = Nothing
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Chart1.Series.Add(TextBox1.Text)
    7. Chart1.ChartAreas(0).AxisX.Title = "Days"
    8. Chart1.ChartAreas(0).AxisY.Title = "Stock price in €"
    9. Chart1.Series(TextBox1.Text).ChartType = DataVisualization.Charting.SeriesChartType.Line
    10. Prices = GetStockPrices(TextBox1.Text)
    11. For Each eintrag In Prices
    12. ListBox1.Items.Add(eintrag)
    13. Chart1.Series(TextBox1.Text).Points.AddY(eintrag)
    14. Next
    15. End Sub
    16. Private Function GetStockPrices(ByVal symbol As String) As List(Of Single)
    17. ' Compose the URL.
    18. Dim url As String = "http://www.google.com/finance/historical?output=csv&q=" & symbol
    19. ' Get the result.
    20. ' Get the web response.
    21. Dim result As String = GetWebResponse(url)
    22. ' Get the historical prices.
    23. Dim lines() As String = result.Split(
    24. New String() {vbCr, vbLf},
    25. StringSplitOptions.RemoveEmptyEntries)
    26. Dim prices As New List(Of Single)()
    27. ' Process the lines, skipping the header.
    28. For i As Integer = 1 To lines.Length - 1
    29. Dim line As String = lines(i)
    30. line = line.Replace(",", ";")
    31. line = line.Replace(".", ",")
    32. prices.Add(Single.Parse(line.Split(";"c)(4)))
    33. Next i
    34. Return prices
    35. End Function
    36. Private Function GetWebResponse(ByVal url As String) As String
    37. ' Make a WebClient.
    38. Dim web_client As New WebClient()
    39. ' Get the indicated URL.
    40. Dim response As Stream = web_client.OpenRead(url)
    41. ' Read the result.
    42. Using stream_reader As New StreamReader(response)
    43. ' Get the results.
    44. Dim result As String = stream_reader.ReadToEnd()
    45. ' Close the stream reader and its underlying stream.
    46. stream_reader.Close()
    47. ' Return the result.
    48. Return result
    49. End Using
    50. End Function
    51. End Class


    Dieses Programm möchte ich auf dem Raspberry ausführen. Ich habe dazu ein neues Windows App Projekt erzeugt. Dabei tritt folgender Fehler auf:

    Der Typ "WebClient" ist nicht definiert.


    Im Folgenden der Code der Windows App (der Button hat z.Z. keine Funktion aber trotzdem müsste das Programm fehlerfrei starten):

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Net
    3. Imports System.IO
    4. Public NotInheritable Class MainPage
    5. Inherits Page
    6. Private Sub button_Click(sender As Object, e As RoutedEventArgs) Handles button.Click
    7. Dim web_client As New WebClient()
    8. End Sub
    9. End Class


    Habt ihr einen Erklärung für mich?

    Im Voraus vielen Dank!

    Besten Gruß,

    Christoph
    @deluxee Willkommen im Forum. :thumbup:
    Für welches Framework hast Du das Programm compiliert?
    Welches Framework ist auf dem Raspberry vorhanden?
    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!
    Hallo RodFromGermany,

    gute Frage! Danke für die schnelle Rückmeldung. Die Windows Forms Anwendung hat als Zielframework: ".NET Framework 4.5.2" und der Raspberry das neueste OS "Version:10.0.14393.576". Ich habe eben auf der Suche nach der Raspberry Frameworkversion folgendes gefunden:


    ​Die Universal Windows Platform (UWP)

    Der .NET/C#-Entwickler wird sich sicherlich freuen, dass hier auf einem kleinen Gerät wie dem Raspberry Pi mit der gewohnten Entwicklungsumgebung und Programmiersprache entwickelt werden kann. Man muss sich allerdings bewusst sein, dass hier nicht der volle Umfang des .NET-Frameworks zur Verfügung steht.

    Wer schon für Windows Phone oder generell Windows Store Apps entwickelt hat, wird sich mit der Umstellung sicher nicht so schwer tun, da hier auch nur ein kleiner Teil des .NET-Frameworks verwendet werden konnte. Man programmierte hier nicht gegen das komplette .NET-Framework, sondern gegen die Windows Runtime (WinRT).

    Für die Entwicklung von Apps für Windows oder Windows Phone wurde seitens Microsoft immer empfohlen, sog. Universal Apps zu programmieren. Dieses Konzept sieht vor, dass man gewisse Programmteile (z.B. die reine Business-Logik) in einem universellen Projekt implementiert und dann angepasste Projekte für die jeweilige Ziel-Plattform (Windows/Windows Phone) hinzufügt, die meistens nur Plattform-spezifischen Code und Oberflächen beinhalten.

    Mit der Universal Windows Platform (UWP) geht Microsoft nun noch einen Schritt weiter: Man entwickelt eine App, die dann auf allen Plattformen läuft: Desktop, Smartphone, Xbox, Geräten wie dem Raspberry Pi (IoT), etc.

    Apps, die für den Raspberry Pi entwickelt werden, sind demnach auch „Universal Windows Apps“.
    @deluxee Leider habe ich keinen Raspberry, da kann ich Dir auch keinen Rat geben, wie Du nun weiter kommen kannst.
    Such mal gezielt nach Entwicklung für Raspberry unter .NET.
    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!
    Hallo deluxee,
    ich habe selber ein Raspberry Pi 3 und programmiere auf Windows 10 IoT Core. Aus diesem Grund verwenden meine Projekte .NETCore. Verweise, welche .NETFramework verwenden, werden dadurch nicht unterstützt.
    "Das Internet ist nur ein Hype" - Bill Gates

    Fakiz schrieb:

    .Net for UWP wie du dem Artikel entnehmen kannst gibt es keinen System.Web Namespace in UWP. Du musst also auf System.Net zuruckgreifen und einen HttpWebrequest verwenden.


    Hallo Fakiz,

    danke für deine Antwort. Ich habe Folgendes probiert:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Net
    3. Imports System.IO
    4. Public NotInheritable Class MainPage
    5. Inherits Page
    6. Private Sub button_Click(sender As Object, e As RoutedEventArgs) Handles button.Click
    7. Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("https://www.web.de")
    8. Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
    9. End Sub
    10. End Class


    ​Fehler BC30456 "GetResponse" ist kein Member von "HttpWebRequest"


    Auch hier scheint es Unterschiede zu geben. Kann hier nur mittelts "Asynchronous HttpWebRequest" gearbeitet werden?

    Gruß,

    Christoph
    Beispiel

    C#-Quellcode

    1. private string DoWebRequest(string url)
    2. {
    3. System.Net.WebRequest request = System.Net.WebRequest.Create(url);
    4. using (System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse())
    5. if (response.StatusCode == System.Net.HttpStatusCode.OK) {
    6. using (System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream()))
    7. return sr.ReadToEnd();
    8. }
    9. else
    10. return string.Format("SatausCode: {0}, StatusDescription: {1}", response.StatusCode, response.StatusDescription);
    11. }


    VB.NET-Quellcode

    1. Private Function DoWebRequest(url As String) As String
    2. Dim request As System.Net.WebRequest = System.Net.WebRequest.Create(url)
    3. Using response As System.Net.HttpWebResponse = DirectCast(request.GetResponse(), System.Net.HttpWebResponse)
    4. If response.StatusCode = System.Net.HttpStatusCode.OK Then
    5. Using sr As New System.IO.StreamReader(response.GetResponseStream())
    6. Return sr.ReadToEnd()
    7. End Using
    8. Else
    9. Return String.Format("SatausCode: {0}, StatusDescription: {1}", response.StatusCode, response.StatusDescription)
    10. End If
    11. End Using
    12. End Function

    Hallo Fakiz,

    danke für dein Beispiel. Leider kommt aber der selbe Fehler in der folgenden Zeile:

    VB.NET-Quellcode

    1. Using response As System.Net.HttpWebResponse = DirectCast(request.GetResponse(), System.Net.HttpWebResponse)


    Fehler BC30456 "GetResponse" ist kein Member von "HttpWebRequest"
    Es scheint so als würde das ganze nur Asynchron funktionieren.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DoWebRequest(url As String)
    2. Dim request As System.Net.WebRequest = System.Net.WebRequest.Create(url)
    3. request.BeginGetResponse(AddressOf ResponseCallback, request)
    4. End Sub
    5. Private Sub ResponseCallback(ar As IAsyncResult)
    6. Dim request As System.Net.HttpWebRequest = DirectCast(ar.AsyncState, System.Net.HttpWebRequest)
    7. Using response As System.Net.HttpWebResponse = DirectCast(request.EndGetResponse(ar), System.Net.HttpWebResponse)
    8. Using sr As New System.IO.StreamReader(response.GetResponseStream())
    9. MessageBox.Show(sr.ReadToEnd())
    10. End Using
    11. End Using
    12. End Sub