2009-08-24 60 views
2

我有這樣的代碼我試圖從C#轉換爲VB.net:如何將委託從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; 
     } 

整個委託的事情是扔我。任何人都可以幫我轉換這個?還是有一篇文章解釋瞭如何做到這一點?

回答

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

fyi:我也更新了我的答案。 – 2009-08-24 16:22:28

+0

從來沒有代碼一個單一的VB.NET程序我相當滿意的結果大聲笑 – 2009-08-25 06:28:31

0

有一個在線C#到位於http://converter.telerik.com/

VB轉換器(反之亦然),我粘貼你的代碼在那裏....我不知道這是否是有效的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

它不會工作 – 2009-08-24 15:01:58

+0

同意,冷杉我去的地方是一個C#到VB.NET轉換器。它基本上給我一個錯誤:VB不支持匿名方法/ lambda表達式與語句正文 – 2009-08-24 15:06:44

8

這是一個匿名函數,和VB.Net不支持這樣的匿名函數(假定NET 2.0,因爲在.net 3.5,將被寫爲一個lambda表達式)。

您可以在VB.Net中做的最好的做法是將匿名函數(委託)作爲單獨的方法添加到同一個類中,並使用AddressOf運算符來引用此新方法。


更新:
重讀你的代碼,翻譯是複雜的,因爲你的匿名方法將被解釋爲封閉,這意味着C#編譯器對代碼打開前一個複雜的轉型它進入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代碼的例子嗎?仍然有困難的時間圍繞着這個... – 2009-08-24 15:16:38

6

我最喜歡的方式是在C#中編譯,然後使用反射器來查看其他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像下面應該給它:(其中_是私人領域(這不是生產RDY而是希望完全給你的想法)

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