2010-01-15 13 views
6

Wie kann ich dieses Stück VB6-Code in C# konvertieren?C# & VB6: Wie konvertiert man 'mit' Anweisung in C#?

http://pastebin.com/f16e19351

Ich habe versucht, mein eigenes auf und bekam so weit:

http://pastebin.com/f7ca199f0

EDIT: Code Ich versuche, existiert hier zu übersetzen: http://www.codeproject.com/KB/vb-interop/MouseHunter.aspx

+0

Mögliches Duplikat von [C# entspricht für Visual Basic-Schlüsselwort: 'Mit' ... 'Ende mit'?] (Http://stackoverflow.com/questions/4174773/c-sharp-equivalent-for-visual-basic -keyword-with-end-with) – DaveInCaz

+0

@DaveInCaz Vielleicht die andere als Duplikat ablegen, da diese Frage vorher gestellt wurde? – Zolomon

Antwort

7

Sie haben den Code EventThief nicht angezeigt, was es unmöglich macht, wirklich zu sagen. Aber im Allgemeinen:

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

zu

übersetzen würde
var x = expression; 
x.Foo = a; 
x.Bar = b; 

(Natürlich können Sie den Typ explizit angeben ...)

Die Gemeinsamkeit ist hier, dass expression nur einmal ausgewertet wird. In dem speziellen Code, den Sie gezeigt haben, besteht natürlich keine Notwendigkeit für eine zusätzliche Variable, da der Ausdruck nur die lokale Variable an erster Stelle ist.

Ihr tatsächlicher Fehler sieht aus, als ob es nur mit den Typen von EventThief.RIGHT_DOWN usw. statt mit der WITH-Anweisung zu tun hat.

EDIT: Okay, Sie haben jetzt die ursprüngliche EventThief Code gezeigt, der tut Verwendung Boolesche ... aber Sie haben nicht gezeigt, Ihre portiertEventThief Code. Sie schrieb:

Es sagt et.LEFT_UP ein

kurz

ist ... aber es sollte nicht sein. Im Original ist es ein , also warum ist es ein short in Ihrem Port?

+0

Ich habe einen Link in meine Frage eingefügt, siehe Bearbeiten. Suchen Sie einfach nach "eventthief" und Sie werden es finden. – Zolomon

+0

Ich weiß nicht, warum es eine kurze, verwende ich tlbimp wie hier erwähnt: http://www.csharp-station.com/Articles/CSharpAndActiveXDlls.aspx das ActiveX-DLL zu ermöglichen, in .NET verwendet werden und ich es nehmen dass es stattdessen in einen kurzen umgewandelt wurde oder so? Ich werde einfach versuchen, das Ganze manuell in C# umzuwandeln. Danke für die Hilfe! – Zolomon

0

Es ist nicht gleichbedeutend mit With in C#, soweit ich weiß, und Sie müssen das Objekt explizit aufführen, wenn es auf seine Member-Funktionen/-Eigenschaften verweist.

0

Es gibt kein C# -Äquivalent.

2

Wie so

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

wird

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

Sie können nicht nur die Art des LEFT_UP ändern, um einen bool zu sein?

Wenn Sie Ihren Code und die Art und Weise, wie Sie EventThief verwenden, verwenden, können Sie eine Flag-Enumeration verwenden, um einzelne Bits zu setzen und dann bitweise Vergleiche durchzuführen.

+0

Ich muss das nachsehen. Vielen Dank! – Zolomon

3

Ich bin nicht sicher, aber ich denke, die in VB folgende

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

lassen sich grob

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

wo RIGHT_UP und RIGHT_DOWN sind öffentliche Eigenschaften in der EventStealingInfo Klasse.

Dieses Konstrukt in C# ist bekannt als Object Initializer.

+0

@stakx: Danke, dass du darauf hingewiesen hast. – missingfaktor

0

Das Schlüsselwort "with" ist nur eine Verknüpfung, um das erneute Eintippen des Variablennamens zu speichern, wenn Sie mehrere Eigenschaften festlegen. Es gibt keine Entsprechung in C#.

Selbst wenn es ein Problem gäbe, würden Sie versuchen, einem kurzen Datentyp einen booleschen Wert zuzuweisen.

Was ist in der EventThief-Klasse? Können Sie die LEFT_UP-Felder stattdessen einfach boolesch machen?

+0

Schauen Sie auf den Link in der Bearbeitung in meiner Frage, suchen Sie nach "EventThief" und Sie werden es finden. – Zolomon

+0

Tatsächlich wird auch die Objektreferenz zwischengespeichert, was Zeit sparen kann, wenn das fragliche Objekt aufgelöst werden muss, indem eine verschachtelte Reihe von Eigenschaften gejagt wird - oder schlimmer noch, ein Methodenaufruf, der eine Instanz für die temporäre Verwendung erstellt. Natürlich können Sie den Cache auch manuell speichern, indem Sie zunächst eine neue temporäre Referenzvariable erstellen und diese verwenden. – Bob77

1

Ich denke, es ist näher Sie gehen können:

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

Ich würde mit dieser Antwort gehen (außer dass es wirklich sagen sollte "... = new EventThief()'). Objektinitialisierer sind wahrscheinlich der Visual Basic-Anweisung "With" am nächsten. – stakx

+0

ops, behoben, ty –

1

Kann ich Ihren Vorschlag Option nennen A.

  1. Nehmen Sie die Community VB6 code, die eine DLL für den Umgang mit Windows-Hooks erstellt.
  2. Übersetzen, das zu C#

Kann ich Option B und C Option vorschlagen, die ich denke, wird es einfacher sein?

Option B
1. Beginnen Sie mit Microsoft's C# code für mit Windows Hooks zu tun.
2. Passen Sie es bei Bedarf an und schauen Sie sich an, welche API die VB6 code makes aufruft.

Option C
1. Nehmen Sie die eingebaute VB6 DLL aus dem community code.
2. Rufen Sie diese DLL von Ihrer neuen C# -Anwendung über Interop auf.

+0

Ich versuchte Option 2 zuerst, dann habe ich versucht, Option 3, wenn die erste fehlgeschlagen. Das war, als ich in den Fehler mit dem falschen Typ in der EventThief-Struktur stieß, also versuchte ich Option 1 und ich stieß auf einen anderen Fehler, der etwas über die GUID sagte, die falsch ist, und ich verlor, was zu tun ist. – Zolomon

Verwandte Themen