代码之家  ›  专栏  ›  技术社区  ›  Mikko Rantanen

NET构造函数顺序是否重要?

  •  8
  • Mikko Rantanen  · 技术社区  · 17 年前

    为什么在vb.net中构造函数顺序很重要?我正在构建一个.NET类型库,它旨在完全包装底层的COM库,以便API的使用者可以假装使用一个带有.NET集合的.NET库,而不是COM库。

    目前,我的大多数类只是使用反射和codedom构建的1到1个包装器。这些类有一个内部构造函数,它将基础COM类型作为参数。codedom将其构建为类的第一个构造函数。使用C中的这些类是没有问题的。我只需要一个对.NET库的引用,一切正常。

    当我尝试使用VB.NET项目中的这些类时,会出现问题。如果第一个构造函数有一个COM类型作为参数,则VB.NET项目需要将COM互操作程序集作为引用。如果第一个构造函数没有参数或只有托管类型,那么一切都可以正常工作。我的班级图书馆是用C语言写的。

    以下工作:

    public class ObjectID
    {
        public ObjectID(int type, int id)
        {
            this.Type = type;
            this.ID = id;
        }
    
        internal ObjectID(COMLib.ObjectID id) : this(id.Type, id.ID) { }
    
        public int ID { get; set; }
        public int Type { get; set; }
    
        internal COMLib.ObjectID ToCOM()
        {
            COMLib.ObjectID id = new COMLib.ObjectID();
            id.ID = this.ID;
            id.Type = this.Type;
            return id;
        }
    }
    

    以下要求引用comlib.interop程序集:

    public class ObjectID
    {
        internal ObjectID(COMLib.ObjectID id) : this(id.Type, id.ID) { }
    
        public ObjectID(int type, int id)
        {
            this.Type = type;
            this.ID = id;
        }
    
        public int ID { get; set; }
        public int Type { get; set; }
    
        internal COMLib.ObjectID ToCOM()
        {
            COMLib.ObjectID id = new COMLib.ObjectID();
            id.ID = this.ID;
            id.Type = this.Type;
            return id;
        }
    }
    

    现在我可以通过为这些类创建一个虚拟的私有构造函数作为第一个构造函数来解决这个问题,但是我更好奇是什么导致了这个问题?为什么在vb.net中构造函数声明的顺序很重要?

    更新

    这听起来太疯狂了,我开始怀疑它自己。成功地将其复制到3个项目中。

    C类库:包装

    namespace Wrapped
    {
        public class Class1
        {
        }
    }
    

    C类库:包装器

    namespace Wrapper
    {
        public class Class1
        {
            internal Class1(Wrapped.Class1 c) { }
            public Class1() { }
        }
    }
    

    vb.net控制台应用程序:引用

    Module Module1
        Sub Main()
            Dim w As New Wrapper.Class1
        End Sub
    End Module
    

    包装是指包装 引用引用包装 引用不引用包装

    Dim w As New Wrapper.Class1
    

    产生错误

    Reference required to assembly 'Wrapped, Version=1.0.0.0,
                                             Culture=neutral,
                                             PublicKeyToken=null'
    containing the type 'Wrapped.Class1'.
    Add one to your project.
    

    交换构造函数的顺序可以处理错误。

    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=442224

    继续玩后更新

    Causes error:          No error:
    
         Vb-ReferTest          Vb-RefererTest
              |                      |                     Fixes error in Vb-
              V                      V                      RefererTest even
          Cs-Wrapper            Cs-Wrapper   Vb-Wrapper <-  if the Vb-Wrapper
              |                       \         /          and the RefererTest
              V                        V       V             have no direct
       Cs-WrappedLibrary           Cs-WrappedLibrary          relationship
    
    3 回复  |  直到 17 年前
        1
  •  1
  •   Marc Gravell    17 年前

    如果是正确的(我很难核实),那就很快了。秩序不重要,阿法克。如果你确定的话,那么也许 log as a bug on connect (带样本代码)。

        2
  •  1
  •   Mikko Rantanen    17 年前

    Confirmed as a bug. 太难修好它,也不值得,所以我想我们只能忍受它。幸运的是,它似乎需要具有不常见类设置的跨语言项目突然出现。

        3
  •  0
  •   Chris Pietschmann    17 年前

    不,构造函数在代码中列出的顺序(使用c或vb.net)并不重要。

    但是,在这个特定的情况下(我没有测试它),您可能发现了一个bug。在跳到“它在我的机器上坏了”结论之前,你可能想让其他人在他们的机器上验证这个问题,所以你知道这不仅仅是你的机器。我以前就有过这样的经历。