Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我不应该使用AutoDual?_C#_Vb6_.net 2.0 - Fatal编程技术网

C# 为什么我不应该使用AutoDual?

C# 为什么我不应该使用AutoDual?,c#,vb6,.net-2.0,C#,Vb6,.net 2.0,到目前为止,我一直使用[AutoDual]属性装饰我希望从VB6使用的.NET类。重点是在VB6环境中获得.NET对象上的Intellisense。然而,前几天我在谷歌上搜索了AutoDual,第一个答案是“不要使用AutoDual” 我一直在寻找为什么我不应该使用它的连贯性解释,但找不到 这里有人能解释一下吗?我想这就是总结: 使用双接口的类型允许 要绑定到特定服务器的客户端 界面布局。a中的任何更改 未来版本的布局 类型或任何基类型将断开COM 绑定到接口的客户端。通过 默认值,如果 Cla

到目前为止,我一直使用
[AutoDual]
属性装饰我希望从VB6使用的.NET类。重点是在VB6环境中获得.NET对象上的Intellisense。然而,前几天我在谷歌上搜索了AutoDual,第一个答案是“不要使用AutoDual”

我一直在寻找为什么我不应该使用它的连贯性解释,但找不到


这里有人能解释一下吗?

我想这就是总结:

使用双接口的类型允许 要绑定到特定服务器的客户端 界面布局。a中的任何更改 未来版本的布局 类型或任何基类型将断开COM 绑定到接口的客户端。通过 默认值,如果 ClassInterfaceAttribute属性为 未指定,仅为分派 使用接口

它增加了这样一种可能性:当类被更改时,使用auto-dual属性更改该类中的某些内容将破坏其他人的代码。If使消费者有能力做一些将来很可能导致他们出现问题的事情

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

我终于找到了有关AutoDual的内容及其工作原理的链接:

针对AutoDual的警告不是最常见的 事实上,双接口是不好的,但是 它自动生成 COM接口。这很糟糕。 每次都必须打开COM接口 您将获得一个新的GUID和 潜在的新成员。如果GUID 改变,然后你得到一个全新的 接口/类(就COM而言) 担心的你最好早点装订 每次都必须重建客户端 重新生成接口。这个 首选方法是定义 COM类接口显式使用 GUID。那么所有的早期绑定 客户端可以使用定义的接口 不用担心它会改变 在开发过程中,它们会发生变化。这就是为什么 建议的选项是“无需告知” CLR不会自动为其生成 你。您仍然可以实现双线程 接口,但如果你需要它


我找到了一种可靠的方法,既可以在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; }
}

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

我不清楚的部分是:`未来版本中对类型或任何基本类型的布局所做的任何更改都将破坏COM客户端'。意思是如果我把一个属性从int改为double,客户端会崩溃吗?或者这是否意味着,如果我只是重新编译.NET文件,VB6客户端将不再能够使用它?只要不更改接口,就应该可以了@Kevin,那么简单地重新编译我的.NET库不会让消费者崩溃吗?“改变方法的顺序”到底意味着什么?意思是改变代码中方法的顺序?我仍然不太明白为什么我们应该避免自动双重。我认为可以理解的是,如果你改变界面,消费者将无法工作。在VB6的世界里,它几乎总是这样的。@AngryHacker理论上不应该这样。我找到了一句话来解释AutoDual会发生什么。@Kevin因此,理论上,如果我用[ClassInterface(ClassInterfaceType.AutoDual)]和[GuidAttribute(“BA713700-522D-466e-8DD4-225884504678”)]来装饰类,那么一切都应该是好的,对吗?