Pergunta

Eu tenho um gerenciado assembly que é chamado via COM Interop. Como um cliente VBScript, um cliente Perl, e assim por diante.

As classes são decorados com

[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]

Então é claro que eu fazer a coisa regasm, e todos os métodos funcionam muito bem.

Mas também há tipos enum na montagem. Eu gostaria de usar aplicativos nomes COM simbólicos, para os valores enum.

Como faço para expor os enums através de interoperabilidade? Eu só precisa adicionar esses atributos?

[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]

E então, como faço referência a esses nomes simbólicos em VBScript? Não vejo os tipos ENUM em OleView. (Deveria?) Eu vejo todos os outros tipos de OleView.

Foi útil?

Solução

VBScript e outros clientes de ligação tardia usar IDispatch para chamar métodos em objetos. Como tal, estas línguas não têm acesso a informações de tipo no typelib -. Eles simplesmente criar um objeto a partir de um GUID, obter um ponteiro de volta IDispatch, e começar a chamar métodos pelo nome

não estou certo da parte de interoperabilidade da questão, mas mesmo que os enums fez show em OleView, você não seria capaz de usá-los diretamente.

No entanto, se você é capaz de publicar os enums no typelib, escrevi uma eras ferramenta atrás, que pode gerar um arquivo de script (VBS ou JS) contendo todos os enums a partir de um typelib como constantes.

Veja aqui: http://www.kontrollbehov.com/tools/tlb2const/

Outras dicas

O meu (até agora única) .NET montagem que eu fiz COM-visível também tinha um tipo de enumeração, que mostrou-se muito bem em OleView. Eu tinha toda a biblioteca ser tão COM-visível

[ComVisible(true)]

não era necessário. É o seu tipo enum público?

Uma coisa que aconteceu foi que os diferentes enumerações foram 'prefixado' com 'enum tipo de nome' _:

public enum DataType
{
    INT32,
    FLOAT64,
    INT8
}

se transformou em:

typedef [...]
enum {
    DataType_INT32 = 0,
    DataType_FLOAT64 = 1,
    DataType_INT8 = 2
} DataType;

na biblioteca de tipos.

Eu sei que este é um fio muito velha, mas eu vou adicionar meus 2 centavos para futuros exploradores. Quando eu definir um enum em C # Eu decorá-lo com [Guid (...), ComVisible (true)] não GuidAttribute.
Por exemplo:

[Guid("28637488-C6B3-44b6-8621-867441284B51"), ComVisible(true)]
public enum myEnum
{
    first,
    second,
    third,
    fourth
}

Em seguida, a enumeração estaria disponível em VB6 como myEnum_first, myEnum_second e assim por diante.

Você pode incluir a atribuição de valores-chave nessa lista, bem, então primeiro = 1 seria válido na enumeração.

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