2009-08-24 5 views
2

Je possède ce code que je suis en train de convertir C# à VB.net:Comment convertir un délégué de C# à vb.net?

public object Invoke(object instance, object[] inputs, out object[] outputs) 
     { 
      // Create a new, STA thread 
      object[] staOutputs = null; 
      object retval = null; 
      Thread thread = new Thread(
       delegate(){ 
        retval = _innerInvoker.Invoke(instance, inputs, out staOutputs); 
       }); 
      thread.SetApartmentState(ApartmentState.STA); 
      thread.Start(); 
      thread.Join(); 
      outputs = staOutputs; 
      return retval; 
     } 

L'ensemble des délégués me jetant. Quelqu'un peut-il m'aider à convertir cela? Ou y a-t-il un article qui explique comment le faire?

Répondre

1

Voici le code final i utilisé:

Public Function Invoke(ByVal instance As Object, ByVal inputs As Object(), ByRef outputs As Object()) As Object Implements System.ServiceModel.Dispatcher.IOperationInvoker.Invoke 
     Dim staOutputs As Object() = Nothing 
     Dim retval As Object = Nothing 
     Dim thread As New Thread(AddressOf DoWork) 
     _instance = instance 
     _inputs = inputs 
     _staOutPuts = staOutputs 
     thread.SetApartmentState(ApartmentState.STA) 
     thread.Start() 
     thread.Join() 
     outputs = staOutputs 
     Return retval 
    End Function 

    Private Function DoWork() As Object 
     Return _innerInvoker.Invoke(_instance, _inputs, _staOutPuts) 
    End Function 

@Rune FS -.!. si près, juste besoin d'un peu d'aide Merci

+0

fyi: J'ai également mis à jour ma réponse. –

+0

Ne jamais avoir un seul programme VB.NET de code Im raisonnablement satisfait du résultat lol –

0

il y a une ligne C# convertisseur VB (et vice-versa) situé à http://converter.telerik.com/

Je collais votre code là .... Je ne sais pas si cela est valide VB ou si elle fonctionne ou non mais vous pouvez essayer.

Public Function Invoke(instance As Object, inputs As Object(), ByRef outputs As Object()) As Object 
    ' Create a new, STA thread 
    Dim staOutputs As Object() = Nothing 
    Dim retval As Object = Nothing 
    Dim thread As New Thread(Function() Do 
     retval = _innerInvoker.Invoke(instance, inputs, staOutputs) 
    End Function) 
    thread.SetApartmentState(ApartmentState.STA) 
    thread.Start() 
    thread.Join() 
    outputs = staOutputs 
    Return retval 
End Function 
+0

Il ne fonctionnera pas –

+0

D'accord, sapins t endroit où je suis allé était un convertisseur de C# en vb.net. il m'a fondamentalement jeté une erreur: VB ne supporte pas les méthodes anonymes/expressions lambda avec un corps d'instruction –

8

Il est une fonction anonyme et VB.Net ne prend pas en charge les fonctions anonymes comme ça (en supposant .Net 2.0, puisque dans .Net 3.5 qui serait écrit comme une expression lambda). Le mieux que vous pouvez faire dans VB.Net est d'ajouter la fonction anonyme (le délégué) comme méthode séparée dans la même classe et d'utiliser l'opérateur AddressOf pour référencer cette nouvelle méthode.


Mise à jour:
lecture à nouveau votre code, la traduction est compliquée parce que votre méthode anonyme sera interprétée comme une fermeture , et cela signifie que le compilateur C# fait une transformation compliquée sur le code avant de en IL; une nouvelle classe est créée est de capturer (fermer plus) les variables locales visées dans la méthode:

Class InnerInvokerClosure 
    Public instance As Object 
    Public inputs() As Object 
    Public staOutputs() As Object 
    Public retValue As Object 

    Public _innerInvoker As SomeDelegateType 

    Sub New(ByRef instance as Object, ByRef inputs() as Object, ByRef staOutputs() As Object, ByRef retValue As Object, ByRef _innerInvoker As SomeDelegateType) 
     Me.instance = instance 
     Me.inputs = inputs 
     Me.staOoutputs = staOutputs 
     Me.retValue = retValue 

     Me._innerInvoker = _innerInvoker 
    End Sub 

    Public Function Invoke() As Object 
     retValue = _innerInvoker.Invoke(instance, inputs, staOutputs); 
    End Function 

End Class 

Public Function Invoke(ByVal instance As Object, ByVal inputs() as Object, ByRef outputs() As Object) As Object 
    Dim closure As New InnerInvokerClosure(instance, inputs, Nothing, Nothing, _innerInvoker) 

    Dim t As New Thread(AddressOf closure.Invoke) 
    t.SetApartmentState(ApartmentState.STA) 
    t.Start() 
    t.Join() 

    outputs = closure.staOutputs 
    return closure.retValue  
End Function 

Notez que cette traduction est non vérifiée et probablement mal: la transformation exacte peut être très compliquée.

+0

Pouvez-vous me donner un exemple dans un code sudo? J'ai toujours du mal à envelopper ma tête ... –

6

Ma façon favorite de faire ceci est de compiler en C#, puis d'utiliser le réflecteur pour voir à quoi il ressemble dans d'autres langages dotNET.

Friend Class Program 
' Methods ' 
Private Shared Function Foo(ByVal instance As Object, ByVal inputs As Object(), <Out> ByRef outputs As Object()) As Object 
    outputs = Nothing 
    Return Nothing 
End Function 

Public Function Invoke(ByVal instance As Object, ByVal inputs As Object(), <Out> ByRef outputs As Object()) As Object 
    Dim staOutputs As Object() = Nothing 
    Dim retval As Object = Nothing 
    Dim thread As New Thread(Function 
     retval = Me._innerInvoker.Invoke(instance, inputs, staOutputs) 
    End Function) 
    thread.SetApartmentState(ApartmentState.STA) 
    thread.Start 
    thread.Join 
    outputs = staOutputs 
    Return retval 
End Function 

' Fields ' 
Private _innerInvoker As MyInvoker = New MyInvoker(AddressOf Program.Foo) 
End Class 


<CompilerGenerated> _ 
Private NotInheritable Class <>c__DisplayClass1 
' Methods ' 
Public Sub <Invoke>b__0() 
    Me.retval = Me.<>4__this._innerInvoker.Invoke(Me.instance, Me.inputs, Me.staOutputs) 
End Sub 


' Fields ' 
Public <>4__this As Program 
Public inputs As Object() 
Public instance As Object 
Public retval As Object 
Public staOutputs As Object() 
End Class 
1

SOmethiong comme ce qui suit devrait lui: (où _ sont des champs privés (ce n'est pas la production RDY mais nous espérons vous donner pleinement l'idée)

Public Function Invoke(instance As Object, inputs As Object(), ByRef outputs As Object()) As Object 
     ' Create a new, STA thread 
     Dim staOutputs As Object() = Nothing 
     Dim retval As Object = Nothing 
     Dim thread As New Thread(AddressOf(Do)) 

     _instance = instance 
     _inputs = inputs 
     _staOutPuts = staOutputs 
     thread.SetApartmentState(ApartmentState.STA) 
     thread.Start() 
     thread.Join() 
     outputs = staOutputs 
     Return retval 
    End Function 

    private Function Do() as Object 
    Return _innerInvoker.Invoke(_instance, _inputs, _staOutputs) 
    end Function 
Questions connexes