VB.Net构造函数顺序很重要?

时间:2009-05-05 21:06:27

标签: .net vb.net interop constructor reference

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

目前我的大多数类只是使用Reflection和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#类库:Wrapped

namespace Wrapped
{
    public class Class1
    {
    }
}

C#类库:Wrapper

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

VB.Net控制台应用程序:Referer

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

Wrapper指的是Wrapped Referer指的是Wrapper Referer不引用Wrapped

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 个答案:

答案 0 :(得分:1)

如果正确(我不能轻易验证),那就是迷人。订单无关紧要,AFAIK。如果你确定,那么可能是log as a bug on connect(带有示例代码)。

答案 1 :(得分:1)

Confirmed as a bug.太难以确定它是否值得,所以我想我们只会忍受它。幸运的是,似乎需要使用不常见的类设置的跨语言项目。

答案 2 :(得分:0)

不,您的构造函数在代码中列出的顺序(使用C#或VB.NET)无关紧要。

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