我为什么不使用AutoDual?

时间:2010-04-26 14:55:28

标签: c# vb6 .net-2.0

到目前为止,我总是使用[AutoDual]属性来装饰我想要在VB6中使用的.NET类。关键是要在VB6环境中获得.NET对象的Intellisense。然而,前几天我用Google搜索AutoDual,第一个答案是“不要使用AutoDual”。

我已经找到了为什么我不应该使用它的连贯解释,但找不到它。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:11)

我找到了一种可靠的方法来为VB6中的.NET对象提供Intellisense,同时不破坏界面。关键是使用DispatchID标记接口中的每个公共方法/属性。然后该类必须从这个接口继承 - 以下面的方式。

[Guid("BE5E0B60-F855-478E-9BE2-AA9FD945F177")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ICriteria
{
    [DispId(1)]
    int ID { get; set; }
    [DispId(2)]
    string RateCardName { get; set; }
    [DispId(3)]
    string 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 string RateCardName { get; set; }
    public string ElectionType { get; set; }
}

调度ID为您提供的是能够在类中移动项目,此外您现在可以向类中添加新内容而不会破坏二进制兼容性。

答案 1 :(得分:9)

我认为这总结了一下:

  

使用双接口的类型允许   客户端绑定到特定的   界面布局。任何变化   未来版本的布局   类型或任何基类型将破坏COM   绑定到接口的客户端。通过   默认,如果   ClassInterfaceAttribute属性是   未指定,仅发送   使用界面。

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

它增加了使用auto dual属性更改该类中的某些内容时,在更改类时会破坏其他人的代码的可能性。如果让消费者能够做一些很可能在未来引起问题的事情。

  

下一个选项是ClassInterfaceType.AutoDual。这也是获得早期绑定支持的快速而肮脏的方法(并使方法显示在VB6 IntelliSense中)。但是通过改变方法的顺序或添加新的重载也很容易破坏兼容性。避免使用AutoDual。

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

我终于找到了一个链接,该链接讨论了AutoDual发生了什么以及它是如何工作的:

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

  

对AutoDual的警告不是   事实上双接口是坏的但是   它自动生成的事实   COM接口为您服务。那很不好。   每次COM接口都必须   重新生成你将得到一个新的GUID和   潜在的新成员。如果是GUID   改变然后你得到一个全新的   接口/类,就COM而言   关心。为了早期绑定你   每次都必须重建客户   界面被重新生成。该   首选方法是定义   COM类接口显式带有   GUID。然后所有的早期绑定   客户端可以使用定义的接口   而不用担心它会改变   他们在发展过程中这就是为什么   推荐的选项是无   CLR不自动生成它   您。你仍然可以实现双重   如果你需要它,可以使用界面。