Vb.Net -> C#

  • C#

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Vb.Net -> C#

    Hey,

    also ich habe den Visual Basic Code:

    VB.NET-Quellcode

    1. Public Class Cryption
    2. Structure RSA_key_Struct
    3. Dim open_key As String
    4. Dim privat_key As String
    5. End Structure
    6. Public Shared Function Create_RSA_Key(Optional ByVal keysize As Integer = 2048) As RSA_key_Struct
    7. Dim RSA_key As RSA_key_Struct
    8. Dim RSA_Crypto As New RSACryptoServiceProvider(keysize)
    9. RSA_key.open_key = RSA_Crypto.ToXmlString(False)
    10. RSA_key.privat_key = RSA_Crypto.ToXmlString(True)
    11. Return RSA_key
    12. End Function
    13. Public Shared Function RSA_ver(ByVal DATA As String, ByVal Openkey_Xml As String, Optional ByVal keysize As Integer = 2048) As String
    14. Dim RSA_Crypto_ver As New RSACryptoServiceProvider(keysize)
    15. Dim byte_data As Byte() = UTF8Encoding.UTF8.GetBytes(DATA)
    16. Dim Out_String As String = String.Empty
    17. RSA_Crypto_ver.FromXmlString(Openkey_Xml)
    18. Out_String = Convert.ToBase64String(RSA_Crypto_ver.Encrypt(byte_data, True))
    19. Return Out_String
    20. End Function
    21. Public Shared Function RSA_ent(ByVal DATA As String, ByVal Privatekey_Xml As String, Optional ByVal keysize As Integer = 2048) As String
    22. Dim RSA_Crypto_ent As New RSACryptoServiceProvider(keysize)
    23. Dim byte_data As Byte() = Convert.FromBase64String(DATA)
    24. Dim Out_String As String = String.Empty
    25. RSA_Crypto_ent.FromXmlString(Privatekey_Xml)
    26. Out_String = Encoding.Default.GetString(RSA_Crypto_ent.Decrypt(byte_data, True))
    27. Return Out_String
    28. End Function
    29. End Class


    Den ich mit:

    VB.NET-Quellcode

    1. Dim RSA_key As Cryption.RSA_key_Struct = Cryption.Create_RSA_Key

    "Benutze"

    Diesen habe ich nun zu C# konvertiert:

    VB.NET-Quellcode

    1. using Microsoft.VisualBasic;
    2. using System;
    3. using System.Collections;
    4. using System.Collections.Generic;
    5. using System.Data;
    6. using System.Diagnostics;
    7. using System.Security.Cryptography;
    8. using System.Text;
    9. public class Cryption
    10. {
    11. public struct RSA_key_Struct
    12. {
    13. public string open_key;
    14. public string privat_key;
    15. }
    16. public static RSA_key_Struct Create_RSA_Key(int keysize = 2048)
    17. {
    18. RSA_key_Struct RSA_key = default(RSA_key_Struct);
    19. RSACryptoServiceProvider RSA_Crypto = new RSACryptoServiceProvider(keysize);
    20. RSA_key.open_key = RSA_Crypto.ToXmlString(false);
    21. RSA_key.privat_key = RSA_Crypto.ToXmlString(true);
    22. return RSA_key;
    23. }
    24. public static string RSA_ver(string DATA, string Openkey_Xml, int keysize = 2048)
    25. {
    26. RSACryptoServiceProvider RSA_Crypto_ver = new RSACryptoServiceProvider(keysize);
    27. byte[] byte_data = UTF8Encoding.UTF8.GetBytes(DATA);
    28. string Out_String = string.Empty;
    29. RSA_Crypto_ver.FromXmlString(Openkey_Xml);
    30. Out_String = Convert.ToBase64String(RSA_Crypto_ver.Encrypt(byte_data, true));
    31. return Out_String;
    32. }
    33. public static string RSA_ent(string DATA, string Privatekey_Xml, int keysize = 2048)
    34. {
    35. RSACryptoServiceProvider RSA_Crypto_ent = new RSACryptoServiceProvider(keysize);
    36. byte[] byte_data = Convert.FromBase64String(DATA);
    37. string Out_String = string.Empty;
    38. RSA_Crypto_ent.FromXmlString(Privatekey_Xml);
    39. Out_String = Encoding.Default.GetString(RSA_Crypto_ent.Decrypt(byte_data, true));
    40. return Out_String;
    41. }
    42. }

    Und:

    VB.NET-Quellcode

    1. Cryption.RSA_key_Struct RSA_key = Cryption.Create_RSA_Key;

    Jedoch kommt nun der Fehler:
    Fehler 1 Die Methodengruppe "Create_RSA_Key" kann nicht in den Nichtdelegattyp "Cryption.RSA_key_Struct" konvertiert werden. Wollten Sie die Methode aufrufen?

    Wie kann ich den fixen? :)
    Funkitonen bzw. Methoden brauchen immer () am Ende, sonst denkt C# du willst den delegaten übergeben(was man bei VB mit AddressOf macht...)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Noch ein Grund wieso VB.NET einfach nur nen riesen Haufen scheiße ist.
    Methoden müssen aufgerufen werden. In jeder vernünftigen Sprache müssen auch parameterlose Methoden aufgerufen werden. In VB.NET nicht.
    Lösung: Häng nen () hinten dran.

    Quellcode

    1. Dim RSA_key As Cryption.RSA_key_Struct = Cryption.Create_RSA_Key()

    Grund ist einfach, dass du ohne die Klammern nicht die Methode ausführst und den Rückgabewert zuweist sondern die Methoden an sich.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Das ist trotz allem nochmal etwas ganz anderes. Vb und C# sind keine Konkurrenten, sie sind sich sogar ziemlich ähnlich. Und sowohl Microsoft als auch allen .Net-Entwicklern ist es letzendlich egal, was du verwendest, also nehm ich lieber das bessere.
    Klar ist VB kein "Haufen Scheiße", es ist sogar eine sehr mächtige Sprache. Nur leider schleppt sie einige unliebsame Erinnerungen aus der Vergangenheit mit, die Einsteiger gerne mal dazu verleiten, diese Macht zu missbrauchen.

    fichz schrieb:

    Mich kotz die Ausdrucksweise einfach an wie sich manche mitteilen müssen.
    Kanns echt nicht sein.
    Bin auch der Ansicht.

    Die Tatsache, dass man in vb.net leere Klammern weglassen kann ist eine ganz unproblematische Eigenart von VB.
    Leider können Konverter-Tools von VB->c# das nicht zuverlässig übersetzen, aber Übersetzbarkeit in annere Sprachen gehört imo nicht in den Katalog der Anforderungen, die man heutzutage an eine gute Sprache stellen muß.
    Und "Haufen Scheiße" ist wirklich eine völlig unberechtigte Entgleisung - ist das iwie cool, mit Kraftausdrücken um sich zu werfen?

    Die Sprache hat euch doch nichts getan, und ihr dürft sie sogar für umsonst frei verwenden! Und ihr tut das ja auch noch!

    also wirklich...
    Öhm ja.. noch eine Frage :s
    Also in VB sah es bei mir so aus:

    VB.NET-Quellcode

    1. Private t As New Threading.Thread(AddressOf Listen)
    2. Sub Listen()
    3. While client.Connected
    4. .......
    5. End While
    6. End Sub

    Client wird hier 'einfach' global deklariert.

    In C# habe ich es nun so übersetzt:

    VB.NET-Quellcode

    1. Thread t = new Thread(new ThreadStart(Listen));
    2. static void Listen()
    3. {
    4. }

    Jedoch kann ich, da es static sein muss nicht auf client zugreifen...
    Wenn es nicht static ist, kommt bei der Zeile:
    Thread t = new Thread...

    Der Error:
    Fehler 1 Ein Feldinitialisierer kann nicht auf das nicht statische Feld bzw. die nicht statische Methode oder Eigenschaft 'ChatClient_CSharp.frmMain.Listen()' verweisen.