Warum sollte ich AutoDual nicht verwenden?

7

Bisher habe ich meine .NET-Klassen, die ich in VB6 verwenden möchte, immer mit dem [AutoDual] -Attribut versehen. Der Punkt war, Intellisense für .NET-Objekte in der VB6-Umgebung zu gewinnen. Aber neulich habe ich AutoDual gegoogelt und die erste Antwort ist 'Do not Use AutoDual'.

Ich habe nach einer kohärenten Erklärung gesucht, warum ich es nicht benutzen sollte, aber ich konnte es nicht finden.

Kann jemand hier erklären?

    
AngryHacker 26.04.2010, 14:55
quelle

2 Antworten

8

Ich denke, das fasst es zusammen:

  

Typen, die eine duale Schnittstelle verwenden, ermöglichen   Clients, die an eine bestimmte Bindung gebunden sind   Schnittstellenlayout. Alle Änderungen in a   zukünftige Version zum Layout der   type oder irgendwelche Basistypen brechen COM   Clients, die an die Schnittstelle binden. Durch   Standard, wenn der   ClassInterfaceAttribute Attribut ist   nicht angegeben, nur Versand   Schnittstelle wird verwendet.

Ссылка

Es erhöht die Möglichkeit, dass das Ändern von etwas in dieser Klasse mit dem auto-dual-Attribut den Code eines anderen bricht, wenn die Klasse geändert wird. Wenn der Verbraucher die Möglichkeit hat, etwas zu tun, das ihnen in Zukunft möglicherweise Probleme bereiten wird.

  

Die nächste Option ist ClassInterfaceType.AutoDual. Dies ist der schnelle und schmutzige Weg, um frühe Bindungsunterstützung zu erhalten (und die Methoden in VB6 IntelliSense erscheinen zu lassen). Es ist aber auch einfach, die Kompatibilität zu unterbrechen, indem Sie die Reihenfolge der Methoden ändern oder neue Überladungen hinzufügen. Vermeiden Sie die Verwendung von AutoDual.

Ссылка

Ich habe endlich den Link gefunden, der darüber spricht, was mit AutoDual passiert und wie es funktioniert:

Ссылка

  

Die Warnung gegen AutoDual ist nicht die   Tatsache, dass Dual-Schnittstellen ist aber schlecht   die Tatsache, dass es automatisch generiert   COM-Schnittstelle für Sie. Das ist schlecht.   Jedes Mal, wenn die COM-Schnittstelle sein muss   regeneriert erhalten Sie eine neue GUID und   möglicherweise neue Mitglieder. Wenn die GUID   Änderungen dann bekommst du ein brandneues   Schnittstelle / Klasse soweit COM ist   besorgt. Für frühe Bindung würdest du   müssen die Clients jedes Mal neu erstellen   Die Schnittstelle wurde neu generiert. Das   bevorzugter Ansatz ist die Definition der   COM-Klassenschnittstelle explizit mit a   GUID. Dann die ganze frühe Bindung   Clients können die definierte Schnittstelle verwenden   und mach dir keine Sorgen, dass es sich ändert   sie während der Entwicklung. Deswegen   Die empfohlene Option ist Keine zu sagen   Die CLR wird nicht automatisch generiert   Sie. Sie können das Dual weiterhin implementieren   Schnittstelle obwohl wenn Sie es brauchen.

    
kemiller2002 26.04.2010, 14:57
quelle
11

Ich habe einen zuverlässigen Weg gefunden, um sowohl Intellisense für .NET-Objekte in VB6 bereitzustellen, als auch die Schnittstelle nicht zu unterbrechen. Der Schlüssel besteht darin, jede öffentliche Methode / Eigenschaft in der Schnittstelle mit DispatchID zu markieren. Dann muss die Klasse von dieser Schnittstelle erben - wie unten beschrieben.

%Vor%

Was Ihnen die Dispatch-ID bietet, ist die Fähigkeit, Objekte in der Klasse zu verschieben. Außerdem können Sie der Klasse jetzt neue Dinge hinzufügen und die Binärkompatibilität nicht aufheben.

    
AngryHacker 28.04.2010 23:46
quelle

Tags und Links