2009-08-02 11 views
2

J'ai besoin d'implémenter une seule instance VB.NET d'une application sur un serveur Terminal Server. Pour ce faire, j'utilise le code du blog Flawless Code. Cela fonctionne bien, sauf que le code est écrit en C# et utilise une méthode anonyme qui n'est pas supportée par VB.NET. J'ai besoin de réécrire ce qui suit afin que je puisse l'utiliser comme un événement dans VB.NET.Méthodes anonymes - C# à VB.NET

static Form1 form; 

static void singleInstance_ArgumentsReceived(object sender, ArgumentsReceivedEventArgs e) 
    { 
     if (form == null) 
      return; 

     Action<String[]> updateForm = arguments => 
      { 
       form.WindowState = FormWindowState.Normal; 
       form.OpenFiles(arguments); 
      }; 
     form.Invoke(updateForm, (Object)e.Args); //Execute our delegate on the forms thread! 
    } 
} 

Répondre

6

Vous pouvez utiliser ce code:

Private Shared form As Form1 

Private Shared Sub singleInstance_ArgumentsReceived(ByVal sender As Object, ByVal e As ArgumentsReceivedEventArgs) 
    If form Is Nothing Then Return 
    form.Invoke(New Action(Of String())(AddressOf updateFormMethod), e.Args) 
End Sub 

Private Shared Sub updateFormMethod(ByVal arguments As String()) 
    form.WindowState = FormWindowState.Normal 
    form.OpenFiles(arguments) 
End Sub 
+0

Salut Ondatra, merci pour la réponse, cela ressemble à cela pourrait fonctionner, mais quand j'essaye de l'implémenter, je reçois une expression '' AddressOf '' ne peut pas être convertie en 'System.Delegate' parce que le type 'System.Delegate' est déclaré ' MustInherit 'et ne peut pas être créé.' Erreur. Merci encore pour votre aide. – Skittles

+0

Je suis désolé, je n'ai pas remarqué l'erreur. J'ai corrigé le code. –

+0

Merci Ondatra. Cela semble fonctionner. Sauf maintenant je continue à obtenir que le formulaire est Rien. Je vais travailler dessus et vous laisser savoir ce que je fais pour le réparer. Encore une fois, merci à tous ceux qui ont aidé. J'apprécie vraiment cela. – Skittles

3

Ce:

public void Somemethod() 
{ 
    Action<String[]> updateForm = arguments => 
     { 
      form.WindowState = FormWindowState.Normal; 
      form.OpenFiles(arguments); 
     }; 
} 

serait le même que:

public void Somemethod() 
{ 
    Action<String[]> updateForm = OnAction; 
} 

//named method 
private void OnAction(string[] arguments) 
{ 
    form.WindowState = FormWindowState.Normal; 
    form.OpenFiles(arguments); 
} 

Ensuite, vous faites facilement la transition VB.net, à quelque chose comme ceci:

Public Sub SomeMethod() 

    Dim updateForm As Action(Of String()) = New Action(Of String())(AddressOf Me.OnAction) 
    Me.form.Invoke(updateForm, New Object() { e }) 

End Sub 

Private Sub OnAction(ByVal arguments As String()) 
    form.WindowState = FormWindowState.Normal 
    form.OpenFiles(arguments) 
End Sub 
+0

Merci kek444, je pense que je vous remercie, il a obtenu une combinaison de votre réponse et la réponse de ondatra .... – Skittles

4

En VB.NET dans VS 2010, vous pouvez effectuer les opérations suivantes:

Shared form As Form1 
Shared Sub singleInstance_ArgumentsReceived(ByVal sender As Object, ByVal e As ArgumentsReceivedEventArgs) 
    If form Is Nothing Then Return 

    Dim updateForm As Action(Of String()) = Sub(arguments) 
               form.WindowState = FormWindowState.Normal 
               form.OpenFiles(arguments) 
              End Sub 

    form.Invoke(updateForm, e.args) 

End Sub 
+0

Salut pb, merci, j'utilise VS2008 cependant, il ne me semble pas vouloir déclarer un Sub dans un Sub. Je reçois 'End Sub' doit être précédé d'un 'Sub' correspondant .. – Skittles