COM INTEROP Support - che è meglio? C # o VB

5

Continuo a sentire che c # è "migliore" di vb ... ma per quanto posso vedere, a parte le differenze sintattiche, entrambi vengono compilati allo stesso IL. Ho trovato alcuni buoni articoli su google che spiegano quali sono le differenze tra i due e quindi mi sento a mio agio nel "diffondere" le conversazioni tra sviluppatori che discutono su vb / c #. =)

Ma ho letto un articolo in cui si diceva che vb.net 2005 aveva un supporto migliore per le cose di interoperabilità di com. Ma mi chiedo se questo è ancora il caso? Questo mi interessa perché siamo nel mezzo della riprogettazione di una vecchia app vb6 che comunica con alcuni vecchi componenti COM.

Qualcuno ha esperienza recente con .NET e interoperabilità COM? Grazie.

    
posta dot 29.01.2013 - 19:44
fonte

2 risposte

15

Prima di .NET 4.0, VB.NET aveva un leggero vantaggio su C # quando chiamava il codice di interoperabilità COM. Ciò era particolarmente vero per il codice, come il modello di programmabilità di Office che, come osserva mortalapeman, fa uso del supporto di COM per i parametri opzionali. Questa API spesso esponeva metodi con 10, 15 o più parametri (ugh!), Che erano tutti ref param, che in C # dovevano essere specificati come riferimenti a Missing.Value . Questo è stato un dolore.

È importante notare, tuttavia, che mentre questo era comune quando si chiamava il codice di Office, non l'ho mai incontrato da nessun'altra parte. La maggior parte delle API COM con cui ho lavorato erano molto più semplici e potevano essere chiamate da C # con poco fastidio.

Tuttavia, in .NET 4.0, anche questo piccolo problema è stato corretto. Per le API COM generiche, è possibile utilizzare la parola chiave dynamic per chiamare il codice tardivo senza che il normale tipo di controllo C di solito richieda e quindi chiamare le API COM senza intoppi. Controlla questo articolo sugli usi generali di dynamic , e questo in particolare per lavorare con gli oggetti COM.

Se stai pensando di usarlo per interoperare con i componenti di Office, C # 4.0 offre una soluzione ancora più semplice. Dai un'occhiata a questo articolo MSDN su Parametri facoltativi di Office :

Visual C# enables you to omit optional ref parameters only for methods of interfaces, not classes.

[...]

If you want to write code that omits optional ref parameters of a method in the ThisDocument class, you can alternatively call the same method on the Microsoft.Office.Interop.Word.Document object returned by the InnerObject property, and omit the parameters from that method. You can do this because Microsoft.Office.Interop.Word.Document is an interface, rather than a class.

Quindi, invece di chiamare myWordDoc.CheckSpelling() con 12 (count'em, 12!) parametri facoltativi inutili, puoi chiamare myWordDoc.InnerObject.CheckSpelling(IgnoreUpperCase: true) , pulito e pulito.

    
risposta data 29.01.2013 - 20:50
fonte
3

L'unica esperienza che ho con l'interoperabilità COM è con C # e l'interazione con Excel in .NET 3.5. Quando si richiamano le funzioni di interoperabilità da C #, è necessario fornire ogni singolo argomento nella chiamata di funzione con un riferimento o un tipo di valore. Se non si utilizzava l'argomento della funzione, è necessario utilizzare System.Type.Missing.Value al suo posto. Tuttavia, se si stesse utilizzando VB, non è stato necessario fornire gli argomenti non utilizzati. Questo link contiene esempi di codice C # e VB che ti mostrano Quanta differenza fa.

Microsoft ha cambiato le API COM per Excel da .NET 3.5 per rendere meno verbose queste funzioni, quindi non è così male come prima. Un motivo per cui uno potrebbe aver scelto VB su C # in passato è probabilmente dovuto al supporto VB per fornire tutti gli argomenti mancanti per te.

    
risposta data 29.01.2013 - 20:12
fonte

Leggi altre domande sui tag