Pourquoi ne devrais-je pas utiliser AutoDual?

Jusqu’à présent, j’ai toujours décoré les classes .NET que je souhaite utiliser à partir de VB6 avec l’atsortingbut [AutoDual] . Le but était d’obtenir Intellisense sur des objects .NET dans l’environnement VB6. Cependant, l’autre jour, j’ai cherché dans AutoDual sur Google et la première réponse est «Ne pas utiliser AutoDual».

J’ai cherché une explication cohérente des raisons pour lesquelles je ne devrais pas l’utiliser, mais je ne l’ai pas trouvée.

Est-ce que quelqu’un ici peut l’expliquer?

Je pense que cela résume:

Les types utilisant une interface double permettent aux clients de se lier à une disposition d’interface spécifique. Toute modification apscope à la disposition du type ou à tout type de base dans une version ultérieure rompra les clients COM qui se lient à l’interface. Par défaut, si l’atsortingbut ClassInterfaceAtsortingbute n’est pas spécifié, une interface de répartition uniquement est utilisée.

http://msdn.microsoft.com/en-us/library/ms182205.aspx

Cela augmente la possibilité que changer quelque chose dans cette classe avec l’atsortingbut double auto casse le code de quelqu’un d’autre lorsque la classe est modifiée. Si donne au consommateur la possibilité de faire quelque chose qui risque de lui causer des problèmes à l’avenir.

L’option suivante est ClassInterfaceType.AutoDual. C’est également un moyen rapide et peu fiable d’obtenir un support de liaison précoce (et d’afficher les méthodes dans VB6 IntelliSense). Mais il est également facile de rompre la compatibilité en modifiant l’ordre des méthodes ou en ajoutant de nouvelles surcharges. Évitez d’utiliser AutoDual.

http://www.dotnetinterop.com/faq/?q=ClassInterface

J’ai enfin trouvé le lien qui parle de ce qui se passe avec AutoDual et de son fonctionnement:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/7fa723e4-f884-41dd-9405-1f68afc72597

L’avertissement contre AutoDual n’est pas le fait que les interfaces doubles soient mauvaises, mais le fait qu’elle génère automatiquement l’interface COM pour vous. C’est mauvais. Chaque fois que l’interface COM doit être régénérée, vous obtenez un nouveau GUID et potentiellement de nouveaux membres. Si le GUID change, vous obtenez une toute nouvelle interface / classe en ce qui concerne COM. Pour une liaison précoce, vous devez reconstruire les clients chaque fois que l’interface est régénérée. L’approche recommandée consiste à définir explicitement l’interface de classe COM avec un GUID. Ensuite, tous les clients de liaison précoce peuvent utiliser l’interface définie sans se soucier de la modification de celle-ci au cours du développement. C’est pourquoi l’option recommandée est Aucune pour indiquer au CLR de ne pas le générer automatiquement pour vous. Vous pouvez toujours implémenter la double interface si vous en avez besoin.

J’ai trouvé un moyen fiable de fournir à la fois des objects Intellisense for .NET dans VB6, tout en préservant l’interface. La clé consiste à marquer chaque méthode / propriété publique dans l’interface avec DispatchID. Ensuite, la classe doit hériter de cette interface – de la manière suivante.

 [Guid("BE5E0B60-F855-478E-9BE2-AA9FD945F177")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface ICriteria { [DispId(1)] int ID { get; set; } [DispId(2)] ssortingng RateCardName { get; set; } [DispId(3)] ssortingng ElectionType { get; set; } } [Guid("3023F3F0-204C-411F-86CB-E6730B5F186B")] [ClassInterface(ClassInterfaceType.None)] [ProgId("MyNameSpace.Criteria")] public class Criteria : ICriteria { public int ID { get; set; } public ssortingng RateCardName { get; set; } public ssortingng ElectionType { get; set; } } 

L’ID de répartition vous donne la possibilité de déplacer des éléments de la classe. De plus, vous pouvez désormais append de nouveaux éléments à la classe sans casser la compatibilité binary.