到目前为止,我总是使用[AutoDual]
属性来装饰我想要在VB6中使用的.NET类。关键是要在VB6环境中获得.NET对象的Intellisense。然而,前几天我用Google搜索AutoDual,第一个答案是“不要使用AutoDual”。
我已经找到了为什么我不应该使用它的连贯解释,但找不到它。
有人可以解释一下吗?
答案 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发生了什么以及它是如何工作的:
对AutoDual的警告不是 事实上双接口是坏的但是 它自动生成的事实 COM接口为您服务。那很不好。 每次COM接口都必须 重新生成你将得到一个新的GUID和 潜在的新成员。如果是GUID 改变然后你得到一个全新的 接口/类,就COM而言 关心。为了早期绑定你 每次都必须重建客户 界面被重新生成。该 首选方法是定义 COM类接口显式带有 GUID。然后所有的早期绑定 客户端可以使用定义的接口 而不用担心它会改变 他们在发展过程中这就是为什么 推荐的选项是无 CLR不自动生成它 您。你仍然可以实现双重 如果你需要它,可以使用界面。