2016-11-07 4 views
4

Ich habe ein C# -Programm, das eine COM-DLL aufruft, die eine Methode test mit zwei Parametern hat: der erste Parameter wird ByVal übergeben, der zweite wird ByRef übergeben.COM Interop-Methodensignatur mit ByRef

Dies ist, was die COM-DLL tut:

Public Sub test(ByVal a As String, ByRef b As String) 
    a = "a" 
    b = "b" 
End Sub 

Dies ist, was C# Programm macht:

test.Class1 x = new test.Class1(); 
      string a = "1"; 
      string b = "2"; 
      x.test(a, ref b); 

Ich stelle fest, dass, wenn ich ref Schlüsselwort entfernen, wird der Compiler Rat ich nicht, dass Ich vermisste das Schlüsselwort ref und übergibt den Parameter ByVal. Dies kann ein großes Problem sein, wenn ich das Schlüsselwort ref vermisse, weil ich es nicht bemerken kann, bis ich weiß, dass es die ref will. Weißt du, warum der Compiler dieses Verhalten zeigt?

+0

@MartinVerjans gibt es keine "Option Strict ON" in C# -Projekten – CRK

+0

@HansPassant Ich teste das Programm ohne ref-Schlüsselwort, und es ändert nicht den Wert der Zeichenfolge. Übergeben Sie die Zeichenfolge ByVal statt ByRef, wenn Sie ihm das nicht mitteilen. – CRK

Antwort

5

Dies ist sehr spezifisch für COM-Interop-Code und C# Sprachversion 4 und höher. Ja, es erlaubt ref in diesem speziellen Fall wegzulassen. C# Version 4 hatte viele Verbesserungen, um die Office-Programmierung zu vereinfachen. Die Office-API wurde ursprünglich so entwickelt, dass sie gut mit früheren VB-Versionen funktioniert. Sie verwendeten standardmäßig ByRef. Immer noch der Fall für VBA. So hat die API eine Los der Methode Parameter, die ByRef sind, obwohl sie das übergebene Argument tatsächlich nicht ändern.

Der Compiler generiert ggf. eine temporäre Variable, um den Aufruf legal zu machen. Mit der Folge, dass Ihre Variable nicht aktualisiert wird. Etwas, auf das Sie achten müssen. Zwei Schritte vorwärts, ein Schritt zurück :)

+0

Wenn ich ein großes Projekt habe und jedes verpasste "Ref" -Schlüsselwort überprüfen möchte, wie kann ich das tun? Oder etwas, das mich auf den Fehler hinweist? – CRK

+0

Hmya, Sie müssen den offensichtlichen Weg verwenden, um Fehler im Code zu finden, verwenden Sie einen Debugger. Keine Panik, nur weil du einen Fehler gemacht hast, heißt das nicht, dass du sie falsch verstanden hast. IntelliSense hilft Ihnen immer noch, es richtig zu machen. Behebe zuerst den COM-Code, es sollte natürlich eine Funktion sein. –

+0

Vielleicht verstehst du mein Problem nicht. Das Problem ist folgendes: Wenn ich ein Ref-Schlüsselwort in einer COM-Methodensignatur vermisse, dann akzeptiert der Compiler es und sagt mir nichts, selbst wenn die Methode tatsächlich einen ByRef-Parameter haben möchte. In einem großen Projekt kann ich nicht jede einzelne Methode überprüfen und sie sind Unterschrift (ich kann, aber es wird viel Zeit brauchen). Ich möchte nur, dass der Compiler mich berät, wenn ich ein Ref-Keyword vermisse. – CRK