Pergunta

Eu tenho um método .NET (C#), que retorna string[][].Quando utilizar RegAsm ou TlbExp (a partir do .NET 2.0 SDK) para criar uma biblioteca de tipos COM o que contém assembleia, recebo o seguinte aviso:

AVISO:Não há nenhuma organização de suporte para matrizes aninhadas.

Este aviso resulta em que o método em questão não está sendo exportado para a biblioteca de tipos gerado.Eu tenho dito que há maneiras de contornar isso usando Variante como COM o tipo de retorno e, em seguida, a fundição/etc no lado do cliente COM.Para este tipo de montagem, o cliente de destino audiência é VB6. Mas, como você fazer isso no .NET lado?

Nota:Eu tenho um legados existentes DLL (com seu exportados tipo de biblioteca), onde o tipo de retorno é Variante, mas essa DLL (e o .tlb) é gerado usando pre-.NET ferramentas antigas, então eu não posso usá-los.

Ajudaria se a assembleia foi escrito em VB.NET em vez disso?

Foi útil?

Solução

Mesmo se você fosse para retornar um Objeto (que mapeia para uma Variante no Interoperabilidade), que não resolve o seu problema.VB será capaz de "segurar" para ele e "passa em volta", mas não será capaz de fazer qualquer coisa com ele.

Tecnicamente, não há nenhum equivalente exato no VB para um string[][].No entanto, se a matriz não é "recortada" (isto é, todas as sub-matrizes têm a mesma duração), você deve ser capaz de usar uma matriz de duas dimensões, como o seu tipo de retorno.Interoperabilidade deve ser capaz de traduzir isso.

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

Se o seu método formalmente retorna um Objeto (que vai olhar como uma Variante para VB), ou uma cadeia de caracteres[,] (que vai olhar como uma Matriz de Cadeias de caracteres no VB), é algo imaterial.A matriz de Seqüência de caracteres é um melhor retorno, mas não uma exigência.

Se você matriz é irregulares, então você vai ter que vir para cima com um método diferente.Por exemplo, você pode escolher para fazer o seu retorno array 2D tão grande como os maiores da sub-matrizes e, em seguida, passar as informações de comprimento em separado [out] int[] parâmetro, de forma que o VB pode saber quais os elementos que são utilizados.

Outras dicas

O equivalente a variante em C# é o Sistema.Objecto.Então você pode querer tentar devolver o resultado do elenco para o objeto e pegá-lo de volta até o outro lado, como uma variante.

O VB não têm quaisquer instalações que o C# não tem, então eu duvido que ele seria o melhor ou mais fácil, se a .NET lado foi escrito em VB.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top