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

标签 .net vb.net interop constructor reference

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

目前我的大多数类只是使用反射和 CodeDOM 构建的 1 对 1 包装器。这些类有一个内部构造函数,它将底层的 COM 类型作为参数。 CodeDOM 将 this 构建为该类的第一个构造函数。在 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;
    }
}

现在我可以通过为这些类创建一个虚拟私有(private)构造函数作为第一个构造函数来解决这个问题,但我更好奇是什么原因造成的?为什么构造函数声明的顺序在 VB.Net 中很重要?

更新

这听起来太疯狂了,以至于我自己开始怀疑。设法用 3 个项目复制它。

C# 类库:已包装
namespace Wrapped
{
    public class Class1
    {
    }
}

C# 类库:包装器
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
引用者不引用 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

最佳答案

如果正确(我无法轻易验证),那真是令人着迷。顺序不重要,AFAIK。如果你确定,那么也许 log as a bug on connect (带有示例代码)。

关于.net - VB.Net 构造函数顺序很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826905/

相关文章:

c# - 向 IntPtr 添加偏移量

c# - SetWindowsHookEx(WH_KEYBOARD) 仅产生第一个事件、顺序事件

c# - 在 C# 中使用具有另一个 C++ 类对象的 C++ 类

c# - NAudio - WaveSram 和 BlockAlignReductionStream

c# - BinaryFormatter 对象图升级

mysql - 使用 VB.NET 连接到 MYSQL

javascript - 在 IF 语句中使用 VB 中的 'Day' 函数来更改日期并根据工作日发送表格

wpf - 使用函数开始调用?

c# - Roslyn:为什么许多 SymbolDisplay 方法在 ISymbol 上有等效的实例对应物?

c# - 低级对象上的 DependencyProperty/INotifyPropertyChanged