2010-01-15 16 views
6

Come posso convertire questo pezzo di codice VB6 in C#?C# e VB6: come convertire 'con' istruzione in C#?

http://pastebin.com/f16e19351

ho provato da solo e ha ottenuto finora per:

http://pastebin.com/f7ca199f0

EDIT: codice che sto cercando di tradurre esiste qui: http://www.codeproject.com/KB/vb-interop/MouseHunter.aspx

+0

Possibile duplicato di [C# equivalente per parola chiave Visual Basic: 'Con' ... 'Fine con'?] (Http://stackoverflow.com/questions/4174773/c-sharp-equivalent-for-visual-basic -keyword-with-end-with) – DaveInCaz

+0

@DaveInCaz Probabilmente file l'altro come duplicato da quando è stata posta questa domanda prima di quella? – Zolomon

risposta

7

Non è stato mostrato il codice EventThief, che rende impossibile dire, davvero. Ma in generale:

With expression 
    .Foo = a 
    .Bar = b 
End With 

si tradurrebbe per

var x = expression; 
x.Foo = a; 
x.Bar = b; 

(Naturalmente è possibile specificare il tipo esplicitamente ...)

La comunanza è che expression viene valutato solo una volta. Nel particolare codice che hai mostrato, non c'è ovviamente bisogno di una variabile extra, poiché l'espressione è solo la variabile locale in primo luogo.

tuo errore effettivo sembra che sia solo a che fare con il tipo di EventThief.RIGHT_DOWN etc, piuttosto che con la dichiarazione CON.

EDIT: Okay, ora che hai mostrato il codice EventThief originale che fa uso booleani ... ma non hai mostrato il tuo portatoEventThief codice. Hai scritto:

si dice et.LEFT_UP a pochi

... ma non dovrebbe essere. Nell'originale è un Boolean, quindi perché è un short nella tua porta?

+0

Ho aggiunto un link nella mia domanda, vedere la modifica. Basta cercare "eventthief" e lo troverai. – Zolomon

+0

Non so perché sia ​​breve, io uso tlbimp come menzionato qui: http://www.csharp-station.com/Articles/CSharpAndActiveXDlls.aspx per consentire l'uso della DLL ActiveX in .NET e la prendo che lo ha convertito in un breve invece o qualcosa del genere? Proverò a convertire manualmente l'intera cosa in C#. Grazie per l'aiuto! – Zolomon

0

Ci non è equivalente a With in C# per quanto ne so e devi elencare esplicitamente l'oggetto quando riferito alle sue funzioni/proprietà membro.

0

Non c'è un equivalente C#.

2

Come così

With EventStealingInfo 
    .RIGHT_DOWN = True 
    .RIGHT_UP = True 
End With 

diventa

EventStealingInfo.RIGHT_DOWN = true; 
EventStealingInfo.RIGHT_UP = true; 
0

Non puoi semplicemente cambiare il tipo di LEFT_UP di essere un bool?

guardando il codice e il modo in cui si utilizza EventThief, si potrebbe voler utilizzare un'enumerazione di flag in modo da poter impostare singoli bit e quindi effettuare confronti bit a bit.

+0

Dovrò cercarlo. Grazie! – Zolomon

3

io non sono troppo sicuro, ma penso che la segue in VB

With EventStealingInfo 
    .RIGHT_DOWN = True 
    .RIGHT_UP = True 
End With 

possono essere approssimativamente tradotto in

var EventStealingInfo = new EventThief(){ 
    RIGHT_DOWN = true, 
    RIGHT_UP = true 
}; 

dove RIGHT_UP e RIGHT_DOWN sono proprietà pubbliche nella classe EventStealingInfo.

Questo costrutto in C# è noto come Object Initializer.

+0

@stakx: Grazie per averlo indicato. – missingfaktor

0

La parola chiave "with" è solo una scorciatoia per salvare la ridigitazione del nome della variabile quando si impostano più proprietà. Non esiste un equivalente in C#.

Anche se ci fosse, avresti ancora un problema che apparentemente stai cercando di assegnare un booleano a un breve tipo di dati.

Cosa c'è nella classe EventThief? Puoi semplicemente rendere i campi LEFT_UP boolean invece?

+0

Guarda il link nella modifica nella mia domanda, cerca "EventThief" e lo troverai. – Zolomon

+0

realtà memorizza nella cache anche il riferimento all'oggetto, che consente di risparmiare tempo se l'oggetto in questione deve essere risolta inseguire una serie nidificata di proprietà - o peggio ancora una chiamata di metodo che crea un'istanza per uso temporaneo. Ovviamente è anche possibile effettuare il cache manualmente creando prima una nuova variabile di riferimento temporanea e usando quella. – Bob77

1

Penso che sia più vicino si può andare:

EventThief EventStealingInfo = new EventThief() 
{ 
    RIGHT_DOWN = true, 
    RIGHT_UP = true 
}; 
+0

Vorrei andare con questa risposta (eccetto che dovrebbe veramente dire '... = new EventThief()'). Gli inizializzatori di oggetti sono probabilmente la cosa più vicina all'istruzione 'With' di Visual Basic. – stakx

+0

ops, risolto questo, ty –

1

posso chiamare la vostra proposta Opzione A.

  1. Prendere la comunità VB6 code che crea una DLL per gestire gli hook di Windows.
  2. tradurlo in C#

Posso suggerire Opzione B e Opzione C, che credo sarà più facile?

Opzione B
1. Iniziare con Microsoft's C# code per trattare con i ganci di Windows.
2. Adattarlo secondo necessità, osservando quale API chiama lo VB6 code makes.

Opzione C
1. Prendere il built VB6 DLL dal community code.
2. Chiama la DLL dalla nuova applicazione C# tramite Interop.

+0

Ho provato prima l'opzione 2, poi ho provato l'opzione 3 quando il primo non è riuscito. In quel momento mi sono imbattuto nell'errore con il tipo sbagliato nella struttura EventThief, quindi ho provato l'opzione 1 e mi sono imbattuto in un altro errore che diceva che il GUID era sbagliato e mi sono perso su cosa fare. – Zolomon