Como expor um enum definido em uma biblioteca COM via interoperabilidade como o tipo de retorno de uma função c #
Espero que a pergunta seja clara, mas para esclarecer:
Eu tenho uma DLL VB6 que define um enum que estou fazendo referência na minha c # dll. O c # dll define um CCW da maneira correta com uma interface idispatch que declara uma função cujo tipo de retorno é o enum.
Ao executar o regasm recebo um aviso de que o enum não é COM visível e, portanto, a função não é exportada. Desde que ele está definido na minha biblioteca VB6 eu teria pensado que já é COM visível, uma vez que é definido em uma dll COM.
Eu percebo que posso parar de brincar e usar um int para passar o enum e apenas fazer o casting, mas é bem frustrante e eu gostaria de saber se existe um caminho.
Conforme solicitado aqui, há algum código de amostra:
VB6 dll define um enum
Public Enum myEnum
first = 0
second = 1
End Enum
Isso é importado através da interoperabilidade para o C # e se você visualizar os metadados, é algo como isto
[Guid("EnumGUID")]
public enum myEnum
{
first = 0,
second = 1
}
Então a interface CCW é definida
[ComVisible(true)]
[Guid("InterfaceGuid")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyCCWInterface
{
[DispId(1)]
myEnum myFunction();
}
Regasm reclama que myEnum não é visível. Eu tenho que concordar com isso, já que a visão de metadados não tem o atributo com visível. Estranhamente, se eu usar outros tipos define no VB dll para argumentos da função não recebo reclamações, apenas parece ser o enum e eu estou supondo que é porque eu estou realmente expondo a implementação interopped do VB6 enum e não o enum real.
Então, eu acho que eu entendo o problema, o que eu gostaria de saber é se há uma maneira de fazer isso funcionar usando enums que não envolva hackear nenhum código intermediário ou gerado automaticamente.