Conversão de tipo importado
Este tópico descreve como o processo de importação converte os seguintes tipos:
Interfaces
Classes
Estruturas
Enumerações
Constantes
Definições de tipo
Em geral, o Tlbimp.exe importa tipos com o mesmo nome que tinham na biblioteca de tipos originais.Nomes em uma biblioteca de tipos devem ser exclusivos, que elimina os conflitos de nomes durante o processo de conversão.Todos os nomes da biblioteca de tipos válidos são nomes de assembly válido.
Escopo de tipos importados pelo namespace ao qual pertencem, que é o mesmo sistema autônomo a biblioteca de tipos originais.Tipos individualmente são identificados por seu namespace completo e digite os nomes.
Você pode controlar explicitamente o nome gerenciado de um tipo importado usando um atributo de biblioteca de tipo na biblioteca de tipos.Esse identificador de atributo definido pelo usuário é 0F21F359-AB84-41e8-9A78-36D110E6D2F9.A biblioteca de tipos a seguir mostra a adição de definido pelo usuário atributo.
Representação de biblioteca de tipo
[ uuid(…),
version(1.0)
]
library AcmeLib {
interface Widget {};
[custom(0F21F359-AB84-41e8-9A78-36D110E6D2F9,
"Acme.WidgetLib.Slingshot")]
coclass Slingshot {};
};
Embora o Tlbimp.exe importa a biblioteca de tipos no namespace AcmeLib, a classe Slingshot torna-se Acme.WidgetLib.Slingshot.
Interfaces
Quando o processo de importação converte uma interface, ele remove todos os IUnknown and IDispatch métodos.A conversão se aplica a GuidAttribute para a interface para reter o identificador de interface (IID) atribuído na biblioteca de tipos e o InterfaceTypeAttribute a menos que a interface é dupla (uma interface derivando de IDispatch).
Representação de biblioteca de tipo
[uuid(…), ]
interface IWidget : IUnknown {
HRESULT New()
HRESULT Start()
};
[uuid(…), ]
interface IGadget : IWidget {
HRESULT Baz()
};
Durante a conversão, o processo de importação adiciona os métodos da interface base à interface derivada.No exemplo a seguir, New e Start são adicionados ao IGadget interface:
<Guid(…), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Interface IWidget
Sub [New]()
Sub Start()
End Interface
<Guid(…), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Interface IGadget
Inherits IWidget
Shadows Sub [New]()
Shadows Sub Start()
Sub Baz()
End Interface
[Guid(…), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IWidget {
void New();
void Start();
};
[Guid(…), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IGadget : IWidget {
new void New();
new void Start();
void Baz();
};
Classes
Cria o processo de importação uma gerenciado coclass de classe para representar cada COM, dando a gerenciado o mesmo nome que o original coclass anexado com classe de classe.Por exemplo, a NewNewer coclass torna-se NewNewerClass. A conversão adiciona o GuidAttribute à classe para capturar o identificador de classe (CLSID) do coclass.
Além de gerenciado adiciona uma interface com o mesmo nome sistema autônomo o coclass de classe, o processo de importação e aplica o CoClassAttribute para identificar o CLSID do coclass original.Essa interface tem a mesma IID sistema autônomo interface padrão para o coclass.Com essa interface, sistema autônomo clientes sempre podem registrar sistema autônomo coletores de eventos.
Ao contrário de uma coclass de COM uma classe gerenciada pode conter membros de classe.Acompanhando a abordagem do .NET estrutura, a conversão adiciona a cada classe os membros associados a cada interface implementada pelo coclass.Os usuários da classe gerenciada podem chamar métodos e propriedades do tipo gerenciado sem primeiro a projeção para uma interface específica.O processo de importação também adiciona um construtor padrão para cada coclass convertido.Um construtor torna possível criar a classe do código gerenciado.(Não não possível criar classes sem um construtor).O construtor padrão não tem argumentos; sua implementação chama o construtor de classe base.Se o noncreatable atributotype de biblioteca é aplicada para o coclass, o processo de importação não cria um construtor padrão para a classe.
Como nomes de membros de interface não são sempre exclusivos, nome e DispId colisões entre os membros podem ocorrer.TlbImp.exe resolve conflitos de nome pela colocação de um prefixo o nome da interface e um sublinhado como o nome de cada membro da classe conflitantes.Onde os nomes dos membros entrarem em conflito, a primeira interface listada na demonstrativo coclass permanece inalterada.
Quando ocorrem DispId colisões, o processo de importação atribui DispIds membros de interface de padrão do coclass e nenhum para os membros de classe conflitantes.No entanto, o processo de importação sempre atribui DispIds membros da interface.
Representação de biblioteca de tipo
[uuid(…)]
interface INew : IDispatch {
[id(0x100)] HRESULT DoFirst();
[id(0x101)] HRESULT DoSecond();
}
[uuid(…)]
interface INewer : IDispatch {
[id(0x100)] HRESULT DoNow();
[id(0x101)] HRESULT DoSecond();
}
[uuid(…)]
coclass NewNewer {
[default] interface INew;
interface INewer;
}
sistema autônomo tipos convertidos aparecem da seguinte maneira:
<Guid(…)> Public Interface INew
…
End Interface
<Guid(…)> Public Interface INewer
…
End Interface
<Guid(…)> Public Interface NewNewer
Inherits INew
…
End Interface
<Guid(…)> Public Class NewNewerClass
Implements INew
Implements INewer
Implements NewNewer
' Method implementation
<DispId(100)> _
…
End Class
[Guid(…)]
public interface INew {…}
[Guid(…)]
public interface INewer {…}
[Guid(…)]
public interface NewNewer : INew {…}
[Guid(…)]
public class NewNewer : INew, INewer, NewNewer{
// Method implementation.
[DispId(100)]…
}
Estruturas
Estruturas definidas dentro de uma biblioteca de tipo são importadas sistema autônomo metadados.Se um campo de uma estrutura é um tipo de referência, Tlbimp.exe importa o tipo sistema autônomo um IntPtr e aplica o ComConversionLossAttribute. O atributo indica que informações eram perdidas durante o processo de importação.
Enumerações
Tipo biblioteca Importer (Tlbimp.exe) importa enumerações não gerenciadas sistema autônomo gerenciado Enum tipos.
Constantes
Constantes não serão importados da biblioteca de tipos nesta versão.
Definições de tipo
Definições de tipo (typedefs) dentro de uma biblioteca de tipo não são importadas.Em vez disso, sistema autônomo campos e parâmetros são importados sistema autônomo sistema autônomo tipos subjacentes.Por exemplo, um parâmetro de tipo BUTTON_COLOR é importado sistema autônomo tipo inteiro, sistema autônomo BUTTON_COLOR é um alias para um número inteiro.
Quando importado, campos e parâmetros de transportam informações que associa seu tipo original no ComAliasNameAttribute. O processo de conversão se aplica a ComAliasNameAttribute para associar um campo, parâmetro ou valor retornado com o nome da biblioteca de tipos e o tipo de biblioteca que foi usado sistema autônomo um alias.
A seguinte representação biblioteca tipo mostra que o cl parâmetro é tipado sistema autônomo um BUTTON_COLOR, que é um alias para um número inteiro.
Representação de biblioteca de tipo
library MyLib {
typedef [public] int BUTTON_COLOR;
interface ISee {
HResult SetColor([in] BUTTON_COLOR cl);
HResult GetColor([out, retval] BUTTON_COLOR *cl);
};
coclass See {
[default] interface ISee
};
};
sistema autônomo tipos convertidos aparecem da seguinte maneira:
public interface ISee {
void SetColor([ComAliasName("MyLib.BUTTON_COLOR")]] int cl);
[return: ComAliasName("MyLib.BUTTON_COLOR")] int GetColor();
};
public class See {
public void SetColor([ComAliasName("MyLib.BUTTON_COLOR")]] int cl);
[return: ComAliasName("MyLib.BUTTON_COLOR")] int GetColor();
};
Observe que o tipo real BUTTON_COLOR não foi definido nos metadados resultante. Em vez disso, sistema autônomo parâmetros são digitados sistema autônomo BUTTON_COLOR na biblioteca de tipos são digitados sistema autônomo o tipo subjacente, inte atribuído com o ComAliasNameAttribute.Esse processo de conversão também se aplica o atributo aos argumentos de métodos de classe.
Consulte também
Conceitos
Conversão de biblioteca importados
Conversão de módulo importados
Conversão do parâmetro importados