Как конвертировать делегат из c # в vb.net?

2

У меня есть этот код, который я пытаюсь преобразовать из С# в 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;
        }

Весь делегат меня отбрасывает. Может ли кто-нибудь помочь мне преобразовать это? Или есть статья, в которой объясняется, как это сделать?

Теги:
delegates

5 ответов

1
Лучший ответ

Вот последний код, который я использовал:

    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 - так близко, просто нужна небольшая помощь. Благодарю!

  • 0
    К вашему сведению: я также обновил свой ответ.
  • 0
    Никогда не имея кода одной единственной программы VB.NET Я вполне доволен результатом LOL
8

Это анонимная функция, и 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

Обратите внимание, что этот перевод не проверен и, вероятно, неверен: точное преобразование может быть очень сложным.

  • 0
    Можете ли вы привести пример в коде sudo? Все еще с трудом справляюсь с этим ...
6

Мой способ сделать это - скомпилировать на С#, а затем использовать рефлектор, чтобы увидеть, как он выглядит на других языках 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, как и следующее: (где _ - частные поля (это не производство, а надежда полностью дает вам идею)

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
0

есть онлайн-конвертер С# в 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
  • 0
    Это не сработает.
  • 0
    Согласен, первое место, куда я пошел, было ac # к конвертеру vb.net. это в основном выдало мне ошибку: VB не поддерживает анонимные методы / лямбда-выражения с телом оператора

Ещё вопросы

Сообщество Overcoder
Наверх
Меню