У меня есть этот код, который я пытаюсь преобразовать из С# в 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;
}
Весь делегат меня отбрасывает. Может ли кто-нибудь помочь мне преобразовать это? Или есть статья, в которой объясняется, как это сделать?
Вот последний код, который я использовал:
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 - так близко, просто нужна небольшая помощь. Благодарю!
Это анонимная функция, и VB.Net не поддерживает анонимные функции, подобные этому (предполагая .Net 2.0, поскольку в .Net 3.5, который будет записан как выражение лямбда).
Самое лучшее, что вы можете сделать в VB.Net, - добавить анонимную функцию (делегат) в качестве отдельного метода в том же классе и использовать оператор AddressOf для ссылки на этот новый метод.
Update:
Чтение кода еще раз, перевод сложный, потому что ваш анонимный метод будет интерпретироваться как закрытие, а это значит, что компилятор С# выполняет сложное преобразование кода, прежде чем превращать его в IL; создается целый новый класс, чтобы захватить (закрыть) локальные переменные, упомянутые в методе:
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
Обратите внимание, что этот перевод не проверен и, вероятно, неверен: точное преобразование может быть очень сложным.
Мой способ сделать это - скомпилировать на С#, а затем использовать рефлектор, чтобы увидеть, как он выглядит на других языках 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
SOmethiong, как и следующее: (где _ - частные поля (это не производство, а надежда полностью дает вам идею)
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
есть онлайн-конвертер С# в VB (и наоборот), расположенный по адресу http://converter.telerik.com/
Я вставил ваш код там.... Я не знаю, действительно ли это VB, или если он будет работать или нет, но вы можете дать ему шанс.
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