2009-05-05 6 views
8

Perché il costruttore ORDER è importante in VB.Net? Sto costruendo una libreria di tipo .Net che è pensata per racchiudere completamente una libreria COM sottostante in modo che i consumatori dell'API possano fingere di usare una bella libreria .Net con collezioni .Net e quant'altro invece di una libreria COM.L'ordine del costruttore VB.Net è importante?

Attualmente la maggior parte delle mie classi sono solo da 1 a 1 wrapper create con Reflection e CodeDOM. Queste classi hanno un costruttore interno che prende come parametro il tipo COM sottostante. CodeDOM lo crea come primo costruttore della classe. L'utilizzo di queste classi da C# non è un problema. Tutto ciò di cui ho bisogno è un riferimento alla libreria .Net e tutto funziona bene.

I problemi si presentano quando provo a utilizzare queste classi da un progetto VB.Net. Se il primo costruttore ha un tipo COM come argomento, il progetto VB.Net richiede l'assembly di interoperabilità COM come riferimento. Se il primo costruttore non ha argomenti o ha solo i tipi gestiti tutto funziona correttamente. La mia libreria di classi è scritta in C#.

le seguenti opere:

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; 
    } 
} 

Quanto segue richiede un riferimento all'assembly 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; 
    } 
} 

Ora posso risolvere questo con la creazione di un costruttore privato fittizio a queste classi come la primo costruttore ma sono più curioso di sapere che cosa causa questo? Perché l'ordine delle dichiarazioni del costruttore è importante in VB.Net?

Aggiornamento

questo suonava così folle che ho iniziato a dubitare di me stesso. Riuscito a replicarlo con 3 progetti.

libreria C# Classe: Spostato

namespace Wrapped 
{ 
    public class Class1 
    { 
    } 
} 

libreria C# Classe: Wrapper

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

VB.Net console app: Referer

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

Wrapper si riferisce a Wrapped Referer si riferisce a Wrapper Referer NON si riferisce a Wrapped

Dim w As New Wrapper.Class1 

genera un errore

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

Scambiare l'ordine dei costruttori si occupa dell'errore.

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

aggiornamento dopo aver giocato in giro ancora un po '

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 

risposta

1

Se corretta (non posso facilmente verificare), che è il posto assolutamente affascinante. L'ordine non dovrebbe importare, AFAIK. Se ne sei sicuro, forse log as a bug on connect (con codice di esempio).

+0

Aggiunto un codice di esempio semplice dopo aver verificato di nuovo me stesso. –

0

No, l'ordine dei Costruttori in cui sono elencati nel codice (utilizzando C# o VB.NET) non importa.

Tuttavia, in questo caso specifico (non ho provato) si potrebbe aver trovato un bug. Prima di saltare alla conclusione "si rompe sulla mia macchina", potresti volere che qualcun altro verifichi il problema sul loro computer, quindi sai che non è solo la tua macchina. Ho avuto questo successo prima.

+0

Si interrompe anche sul mio computer di lavoro in ufficio. Così testato su Vista a 64 bit e XP a 32 bit ora. Stavo pensando di testarlo domani ma da quando hai menzionato, l'ho fatto su RDesktop. –

1

Confirmed as a bug. Troppo difficile da risolvere perché valga la pena, quindi suppongo che vivremo con esso. Fortunatamente sembra che siano necessari progetti di linguaggio incrociato con configurazioni di classi non comuni.

+0

La soluzione alternativa fornita come commento nel collegamento Connect funziona correttamente? – SqlRyan

+0

Sì, sì. È fondamentalmente lo stesso dell'ultimo aggiornamento della domanda. Se si controlla l'origine della libreria wrapper, una soluzione più semplice è spostare il costruttore senza parametri predefinito in alto o aggiungerne uno privato se non esiste un costruttore senza parametri esistente, come pubblicato nella sezione Workaround su Connect. Questo risolve il problema anche per gli utenti futuri. –