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.
fyi: J'ai également mis à jour ma réponse. –
Ne jamais avoir un seul programme VB.NET de code Im raisonnablement satisfait du résultat lol –