Domanda

Ho un metodo in .NET (C#) che restituisce string[][].Quando si utilizza RegAsm o TlbExp (da .NET 2.0 SDK) per creare una libreria di tipi COM per l'assembly contenente, viene visualizzato il seguente avviso:

AVVERTIMENTO:Non è disponibile alcun supporto per il marshalling per gli array nidificati.

Questo avviso fa sì che il metodo in questione non venga esportato nella libreria dei tipi generata.Mi è stato detto che esistono modi per aggirare questo problema utilizzando Variant come tipo di ritorno COM e quindi trasmettendo/etc sul lato client COM.Per questo particolare assieme, il pubblico di destinazione è VB6. Ma come si fa effettivamente a farlo sul lato .NET?

Nota:Ho una DLL legacy esistente (con la relativa libreria dei tipi esportata) in cui il tipo restituito è Variant, ma questa DLL (e .tlb) viene generata utilizzando strumenti legacy pre-.NET, quindi non posso usarli.

Sarebbe d'aiuto se invece l'assembly fosse scritto in VB.NET?

È stato utile?

Soluzione

Anche se dovessi restituire un oggetto (che mappa a una variante in COM Interop), ciò non risolve il tuo problema.VB potrà "trattenerlo" e "passarlo in giro", ma non potrà farci nulla.

Tecnicamente non esiste un equivalente esatto in VB per una stringa[][].Tuttavia, se l'array non è "frastagliato" (ovvero, tutti i sottoarray hanno la stessa lunghezza), dovresti essere in grado di utilizzare un array bidimensionale come tipo restituito.COM Interop dovrebbe essere in grado di tradurlo.

string [,] myReturnValue = new string[rowCount,colCount];

Se il tuo metodo restituisce formalmente un oggetto (che assomiglierà a una variante in VB) o una stringa[,] (che assomiglierà a un array di stringhe in VB), è in qualche modo irrilevante.L'array String è un risultato migliore, ma non un requisito.

Se schieri È frastagliato, allora dovrai trovare un metodo diverso.Ad esempio, potresti scegliere di rendere l'array 2D restituito grande quanto il più grande dei sottoarray e quindi passare le informazioni sulla lunghezza in un parametro [out] int[] separato, in modo che VB possa sapere quali elementi vengono utilizzati.

Altri suggerimenti

L'equivalente della variante in C# è System.Object.Quindi potresti provare a restituire il risultato cast all'oggetto e riprenderlo dall'altra parte come variante.

VB non dispone di funzionalità che mancano a C#, quindi dubito che sarebbe migliore o più semplice se il lato .NET fosse scritto in VB.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top