为什么构造函数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#类库:包装器
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
包装是指包装
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
如果正确(我不能轻易验证),那就是迷人.订单无关紧要,AFAIK.如果你确定,那么可能是
log as a bug on connect(带有示例代码).