C# Code in VB übersetzungsproblem (Event von DLL)

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

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    C# Code in VB übersetzungsproblem (Event von DLL)

    Hallo zusammen,
    hab leider ein etwas komplizierteres Problem, aber vielleicht hat jemand einen Tipp.
    Ich habe ein Beispielprogramm bekommen welches in C# geschrieben ist. Da ich C# nicht kann... täte ich mir zur Weiterentwicklung viel leichter wenn ich das in VB .NET umstricken kann. Komme aus der VB 6 Welt und versuche mich gerade in VB.NET. 95% klappt bereits aber bei diesem Teil hab ich ein Problem...

    Hersteller DLL wird per Verweis eingebunden und stellt Hundegger.Messaging.MessageDistributorTypes.RemoteEvents zur Verfügung.

    C# Version (funktioniert):
    Spoiler anzeigen

    C#-Quellcode

    1. using Hundegger.Messaging.MessageDistributorTypes.RemoteEvents;
    2. namespace IpcExample
    3. {
    4. public class IpcManager : INotifyPropertyChanged
    5. {
    6. private RemoteEventReceiver _remoteEventReceiver;
    7. private void SetupRemoteEventReceiver()
    8. {
    9. _remoteEventReceiver = new RemoteEventReceiver();
    10. _remoteEventReceiver.CreateJobFinishedEvent += OnCreateJobFinished;
    11. _remoteEventReceiver.StartListening(null);
    12. }
    13. }
    14. }



    Mein Versuch das in VB.NET zu machen:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Hundegger.Messaging.MessageDistributorTypes.RemoteEvents
    2. Public Class IpcManager
    3. Private _remoteEventReceiver As RemoteEventReceiver
    4. Private Sub SetupRemoteEventReceiver()
    5. _remoteEventReceiver = New RemoteEventReceiver()
    6. AddHandler _remoteEventReceiver.CreateJobFinishedEvent, AddressOf OnCreateJobFinished
    7. _remoteEventReceiver.StartListening(Nothing)
    8. End Sub
    9. Private Sub OnCreateJobFinished(ByVal senderId As String, ByVal jobKey As String, ByVal success As Boolean, ByVal incidents As String)
    10. CreateJobSuccess = success
    11. End Sub
    12. End Class



    die AddHandler Zeile bringt den Fehler: "CreateJobFinishedEvent" ist kein Ereignis von "RemoteEventReceiver".

    Lt. der Herstellerfirma Dokumentation sollte es aber ein Ereignis erzeugen... nur der Zugriff per VB ist mir wahrscheinlich nicht klar. CreateJobFinishedEvent erscheint im VB und in C# Objektkatalog als "Feld oder Variable" und nicht als Event. Aber warum geht die Funktion in C#?

    Hat jemand von euch vielleicht eine Idee?

    vg
    Mathias

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

    Willkommen im Forum. :thumbup:

    Laser5000 schrieb:

    VB.NET-Quellcode

    1. Private _remoteEventReceiver As RemoteEventReceiver
    machst Du

    VB.NET-Quellcode

    1. Private WithEvents _remoteEventReceiver As RemoteEventReceiver

    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!
    Hi,

    die WithEvents Idee hatte ich auch schon irgendwo entdeckt... nützt aber auch nichts.

    Hier noch der OnCreateJobFinished Teil aus dem C#...

    Spoiler anzeigen

    C#-Quellcode

    1. private void OnCreateJobFinished(string senderId, string jobKey, bool success, string incidents)
    2. {
    3. // hier könnte nach der senderId gefiltert werden
    4. // diese Property wird per Databinding in einer Checkbox angezeigt
    5. CreateJobSuccess = success;
    6. }



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

    Laser5000 schrieb:

    nützt aber auch nichts
    Poste bitte den Tehlertext und die Zeile, in der er auftritt.
    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!

    Laser5000 schrieb:

    CreateJobFinishedEvent
    Steht da in C# irgendwo event ... CreateJobFinishedEvent ...?
    Poste mal die komplette C#-Klasse.
    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!
    Nein event... CreateJobFinishedEvent finde ich nicht...
    hier die komplette ungekürzte Klasse:

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.ComponentModel;
    3. using System.Windows;
    4. using System.Windows.Resources;
    5. using System.Xml.Linq;
    6. using Hundegger.Messaging.IPC;
    7. using Hundegger.Messaging.MessageDistributorTypes.RemoteCommands;
    8. using Hundegger.Messaging.MessageDistributorTypes.RemoteEvents;
    9. namespace IpcExample
    10. {
    11. public class IpcManager : INotifyPropertyChanged
    12. {
    13. private RemoteCommandDistributor _remoteCommandDistributor;
    14. private RemoteEventReceiver _remoteEventReceiver;
    15. private const string CambiumId = "Cambium_Maschine";
    16. public IpcManager()
    17. {
    18. JobName = "ExampleJob";
    19. CreateJobSuccess = false;
    20. Connected = false;
    21. }
    22.  
    23. public void BootUp()
    24. {
    25. _remoteCommandDistributor = new RemoteCommandDistributor();
    26. _remoteCommandDistributor.ConnectEvent += OnConnect;
    27. _remoteCommandDistributor.DisConnectEvent += OnDisConnect;
    28. SetupRemoteEventReceiver();
    29. }
    30. public void ShutDown()
    31. {
    32. _remoteCommandDistributor.ConnectEvent -= OnConnect;
    33. _remoteCommandDistributor.DisConnectEvent -= OnDisConnect;
    34. _remoteCommandDistributor.ClearConfiguredServices();
    35. _remoteCommandDistributor.Dispose();
    36. }
    37.  
    38. private void SetupRemoteEventReceiver()
    39. {
    40. _remoteEventReceiver = new RemoteEventReceiver();
    41. _remoteEventReceiver.CreateJobFinishedEvent += OnCreateJobFinished;
    42. _remoteEventReceiver.LoadNestingToJobFinishedEvent += OnLoadNestingToJobFinished;
    43. _remoteEventReceiver.TransferNestingToCutlistFinishedEvent += OnTransferNestingToCutlistFinished;
    44. _remoteEventReceiver.StartListening(null);
    45. }
    46.  
    47. #region /// Connection
    48. private bool _connected;
    49. public bool Connected
    50. {
    51. get { return _connected; }
    52. set
    53. {
    54. _connected = value;
    55. OnPropertyChanged("Connected");
    56. }
    57. }
    58. private string _connectionUri = "";
    59. public string ConnectionUri
    60. {
    61. get { return _connectionUri; }
    62. set
    63. {
    64. _connectionUri = value;
    65. OnPropertyChanged("ConnectionUri");
    66. }
    67. }
    68. private void OnConnect(object sender, ConnectionEventArgs connectionEventArgs)
    69. {
    70. // die hier gesetzten Properties werden über Databinding im User Interface angezeigt
    71. Connected = true;
    72. ConnectionUri = connectionEventArgs.Address.ToString();
    73. }
    74. private void OnDisConnect(object sender, ConnectionEventArgs connectionEventArgs)
    75. {
    76. // die hier gesetzten Properties werden über Databinding im User Interface angezeigt
    77. Connected = false;
    78. ConnectionUri = "";
    79. }
    80.  
    81.  
    82. #endregion
    83. #region /// Create Job
    84. private string _jobName;
    85. public string JobName
    86. {
    87. get { return _jobName; }
    88. set
    89. {
    90. _jobName = value;
    91. OnPropertyChanged("JobName");
    92. }
    93. }
    94.  
    95. private const string JobKey = "E4DE7D0A-55A2-428F-BF91-B2523B5173E6";
    96.  
    97. private bool _createJobSuccess;
    98. public bool CreateJobSuccess
    99. {
    100. get { return _createJobSuccess;}
    101. set
    102. {
    103. _createJobSuccess = value;
    104. OnPropertyChanged("CreateJobSuccess");
    105. }
    106. }
    107.  
    108. public void CreateJob()
    109. {
    110. CreateJobSuccess = false;
    111. _remoteCommandDistributor.CreateJob(CambiumId, JobKey, JobName);
    112. }
    113.  
    114. private void OnCreateJobFinished(string senderId, string jobKey, bool success, string incidents)
    115. {
    116. // hier könnte nach der senderId gefiltert werden
    117. // diese Property wird per Databinding in einer Checkbox angezeigt
    118. CreateJobSuccess = success;
    119. }
    120. #endregion // Create Job
    121.  
    122. #region /// LoadNesting
    123. private bool _loadNestingSuccess;
    124. public bool LoadNestingSuccess
    125. {
    126. get { return _loadNestingSuccess; }
    127. set
    128. {
    129. _loadNestingSuccess = value;
    130. OnPropertyChanged("LoadNestingSuccess");
    131. }
    132. }
    133. private string _nestingKey;
    134.  
    135. public void LoadNesting()
    136. {
    137. LoadNestingSuccess = false;
    138. // das Default-Nesting laden:
    139. StreamResourceInfo resInfo = Application.GetResourceStream(new Uri("/IpcExample;component/DefaultNesting.xml", UriKind.Relative));
    140. if (resInfo != null)
    141. {
    142. XDocument doc = XDocument.Load(resInfo.Stream);
    143. string nestingSnippet = doc.Root.ToString();
    144. _remoteCommandDistributor.LoadNestingToJob(CambiumId, JobKey, nestingSnippet);
    145. }
    146. }
    147. private void OnLoadNestingToJobFinished(string senderId, string jobId, string nestingId, bool success, string incidents)
    148. {
    149. LoadNestingSuccess = success;
    150. _nestingKey = success ? nestingId : null;
    151. }
    152. #endregion
    153. #region // Transfer Nesting to Cultlist
    154. private bool _transferNestingSuccess;
    155. public bool TransferNestingSuccess
    156. {
    157. get { return _transferNestingSuccess;}
    158. set
    159. {
    160. _transferNestingSuccess = value;
    161. OnPropertyChanged("TransferNestingSuccess");
    162. }
    163. }
    164. public void TransferNestingToCultlist()
    165. {
    166. _remoteCommandDistributor.TransferNestingToCutlist(CambiumId, JobKey, _nestingKey, 0, false);
    167. }
    168.  
    169. private void OnTransferNestingToCutlistFinished(string senderId, string jobId, string productionElement, bool success, string incidents)
    170. {
    171. TransferNestingSuccess = success;
    172. }
    173. #endregion
    174.  
    175.  
    176.  
    177. #region /// implementation of INotifyPropertyChanged
    178. public event PropertyChangedEventHandler PropertyChanged;
    179. protected virtual void OnPropertyChanged(string propertyName)
    180. {
    181. var handler = PropertyChanged;
    182. if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    183. }
    184. #endregion
    185. }
    186. }

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

    Laser5000 schrieb:

    C#-Quellcode

    1. public event PropertyChangedEventHandler PropertyChanged;
    ganz unten.
    Du musst zuerst alle Verweise, die im C#-Projekt drin sind, in das VB-Projekt einfügen.
    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!
    Ok... hätte nicht gedacht der Teil auch dazu gehört...
    habe ich so übersetzt:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    2. Protected Overridable Sub OnPropertyChanged(propertyName As String)
    3. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    4. End Sub




    hier mal der ganze Code...

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.ComponentModel
    3. Imports System.Windows
    4. Imports System.Windows.Resources
    5. Imports System.Xml.Linq
    6. Imports Hundegger.Messaging.IPC
    7. Imports Hundegger.Messaging.MessageDistributorTypes.RemoteCommands
    8. Imports Hundegger.Messaging.MessageDistributorTypes.RemoteEvents
    9.  
    10. Public Class Form1
    11. Private _ipcManager As IpcManager
    12. Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    13. If _ipcManager.Connected Then _ipcManager.ShutDown()
    14. End
    15. End Sub
    16. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    17. _ipcManager = New IpcManager()
    18. _ipcManager.BootUp()
    19. DataContext = _ipcManager
    20. End Sub
    21.  
    22. Private Sub ButtonCreateJob_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonCreateJob.Click
    23. If _ipcManager.Connected Then
    24. _ipcManager.CreateJob()
    25. End If
    26. End Sub
    27. Private Sub ButtonLoadNesting_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonLoadNesting.Click
    28. If _ipcManager.Connected Then
    29. _ipcManager.LoadNesting()
    30. End If
    31. End Sub
    32. Private Sub ButtonTransferNesting_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTransferNesting.Click
    33. If _ipcManager.Connected Then
    34. _ipcManager.TransferNestingToCultlist()
    35. End If
    36. End Sub
    37.  
    38. End Class
    39. Public Class IpcManager
    40. Implements INotifyPropertyChanged
    41. Private _remoteCommandDistributor As RemoteCommandDistributor
    42. Private _remoteEventReceiver As RemoteEventReceiver
    43.   Private Const CambiumId As String = "Cambium_Maschine"
    44. Public Sub New()
    45. JobName = "ExampleJob"
    46. CreateJobSuccess = False
    47. Connected = False
    48. End Sub
    49. Public Sub BootUp()
    50. _remoteCommandDistributor = New RemoteCommandDistributor()
    51. AddHandler _remoteCommandDistributor.ConnectEvent, AddressOf OnConnect
    52. AddHandler _remoteCommandDistributor.DisConnectEvent, AddressOf OnDisConnect
    53. SetupRemoteEventReceiver()
    54. End Sub
    55. Public Sub ShutDown()
    56. RemoveHandler _remoteCommandDistributor.ConnectEvent, AddressOf OnConnect
    57. RemoveHandler _remoteCommandDistributor.DisConnectEvent, AddressOf OnDisConnect
    58. _remoteCommandDistributor.ClearConfiguredServices()
    59. _remoteCommandDistributor.Dispose()
    60. End Sub
    61. Private Sub SetupRemoteEventReceiver()
    62. _remoteEventReceiver = New RemoteEventReceiver()
    63. AddHandler _remoteEventReceiver.CreateJobFinishedEvent, AddressOf OnCreateJobFinished
    64. AddHandler _remoteEventReceiver.LoadNestingToJobFinishedEvent, AddressOf OnLoadNestingToJobFinished
    65. AddHandler _remoteEventReceiver.TransferNestingToCutlistFinishedEvent, AddressOf OnTransferNestingToCutlistFinished
    66. _remoteEventReceiver.StartListening(Nothing)
    67. End Sub
    68. #Region ""
    69. Private _connected As Boolean
    70. Public Property Connected() As Boolean
    71. Get
    72. Return _connected
    73. End Get
    74. Set(ByVal value As Boolean)
    75. _connected = value
    76. OnPropertyChanged("Connected")
    77. End Set
    78. End Property
    79. Private _connectionUri As String = ""
    80. Public Property ConnectionUri() As String
    81. Get
    82. Return _connectionUri
    83. End Get
    84. Set(ByVal value As String)
    85. _connectionUri = value
    86. OnPropertyChanged("ConnectionUri")
    87. End Set
    88. End Property
    89. Private Sub OnConnect(ByVal sender As Object, ByVal connectionEventArgs As ConnectionEventArgs)
    90. ' die hier gesetzten Properties werden über Databinding im User Interface angezeigt
    91. Form1.ConnectedCheckbox.Checked = True
    92. Connected = True
    93. ConnectionUri = connectionEventArgs.Address.ToString()
    94. Form1.ConnectionLabel.Text = ConnectionUri
    95. End Sub
    96. Private Sub OnDisConnect(ByVal sender As Object, ByVal connectionEventArgs As ConnectionEventArgs)
    97. ' die hier gesetzten Properties werden über Databinding im User Interface angezeigt
    98. Form1.ConnectedCheckbox.Checked = False
    99. Connected = False
    100. ConnectionUri = ""
    101. Form1.ConnectionLabel.Text = ConnectionUri
    102.  
    103. End Sub
    104.  
    105.  
    106. #End Region
    107. #Region ""
    108. Private _jobName As String
    109. Public Property JobName() As String
    110. Get
    111. Return _jobName
    112. End Get
    113. Set(ByVal value As String)
    114. _jobName = value
    115. OnPropertyChanged("JobName")
    116. End Set
    117. End Property
    118.  
    119. Private Const JobKey As String = "E4DE7D0A-55A2-428F-BF91-B2523B5173E6"
    120.  
    121. Private _createJobSuccess As Boolean
    122. Public Property CreateJobSuccess() As Boolean
    123. Get
    124. Return _createJobSuccess
    125. End Get
    126. Set(ByVal value As Boolean)
    127. _createJobSuccess = value
    128. OnPropertyChanged("CreateJobSuccess")
    129. End Set
    130. End Property
    131.  
    132. Public Sub CreateJob()
    133. CreateJobSuccess = False
    134. _remoteCommandDistributor.CreateJob(CambiumId, JobKey, JobName)
    135. End Sub
    136.  
    137. Private Sub OnCreateJobFinished(ByVal senderId As String, ByVal jobKey As String, ByVal success As Boolean, ByVal incidents As String)
    138. ' hier könnte nach der senderId gefiltert werden
    139. ' diese Property wird per Databinding in einer Checkbox angezeigt
    140. CreateJobSuccess = success
    141. End Sub
    142. #End Region
    143.  
    144. #Region ""
    145. Private _loadNestingSuccess As Boolean
    146. Public Property LoadNestingSuccess() As Boolean
    147. Get
    148. Return _loadNestingSuccess
    149. End Get
    150. Set(ByVal value As Boolean)
    151. _loadNestingSuccess = value
    152. OnPropertyChanged("LoadNestingSuccess")
    153. End Set
    154. End Property
    155. Private _nestingKey As String
    156.  
    157. Public Sub LoadNesting()
    158. LoadNestingSuccess = False
    159. ' das Default-Nesting laden:
    160. Dim resInfo As StreamResourceInfo = Application.GetResourceStream(New Uri("/WindowsApplication2;component/DefaultNesting.xml", UriKind.Relative))
    161. If resInfo IsNot Nothing Then
    162. Dim doc As XDocument = XDocument.Load(resInfo.Stream)
    163. Dim nestingSnippet As String = doc.Root.ToString()
    164. _remoteCommandDistributor.LoadNestingToJob(CambiumId, JobKey, nestingSnippet)
    165. End If
    166. End Sub
    167. Private Sub OnLoadNestingToJobFinished(ByVal senderId As String, ByVal jobId As String, ByVal nestingId As String, ByVal success As Boolean, ByVal incidents As String)
    168. LoadNestingSuccess = success
    169. _nestingKey = If(success, nestingId, Nothing)
    170. End Sub
    171. #End Region
    172. #Region ""
    173. Private _transferNestingSuccess As Boolean
    174. Public Property TransferNestingSuccess() As Boolean
    175. Get
    176. Return _transferNestingSuccess
    177. End Get
    178. Set(ByVal value As Boolean)
    179. _transferNestingSuccess = value
    180. OnPropertyChanged("TransferNestingSuccess")
    181. End Set
    182. End Property
    183. Public Sub TransferNestingToCultlist()
    184. _remoteCommandDistributor.TransferNestingToCutlist(CambiumId, JobKey, _nestingKey, 0, False)
    185. End Sub
    186. Private Sub OnTransferNestingToCutlistFinished(ByVal senderId As String, ByVal jobId As String, ByVal productionElement As String, ByVal success As Boolean, ByVal incidents As String)
    187. TransferNestingSuccess = success
    188. End Sub
    189. #End Region
    190. #Region ""
    191. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    192. Protected Overridable Sub OnPropertyChanged(propertyName As String)
    193. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    194. End Sub
    195. #End Region
    196. End Class

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

    Laser5000 schrieb:

    hier mal der ganze Code...
    Editiere bitte Deine Beiträge (Plural) und pach den Code in einen Spoiler.
    Code markieren und auf Spoiler drücken.

    Dann machen wir weiter. ;)
    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!

    Laser5000 schrieb:

    die DLL
    ist für Framework 4.5.2 compiliert, da kann ich mit meinem 4.5.1 als Hauptprogramm nix machen. Sorry. ;(
    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!
    Hi,
    hakt immernoch an den vom Hersteller lt. Doku in der DLL vorhandenen Events... z.b. CreateJobFinishedEvent
    Meiner Meinung sind das keine richtigen Events... Auszug aus dem Objektkatalog:

    Public CreateJobFinishedEvent As System.Action(Of String, String, Boolean, String)
    Element von Hundegger.Messaging.MessageDistributorTypes.RemoteEvents.RemoteEventReceiver

    in der C# Variante wird beim Auslösen von diesem "Event" der DLL die Sub CreateJobFinished aufgerufen. Wie verklickere ich das VB.NET?

    Laser5000 schrieb:

    Es läuft!!!!!!!!
    Jou.
    Die DLL hat ne kleine Hacke, wenn die weg ist, compiliert es sofort.
    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!