Personalizar contenedores CCW
La personalización de un contenedor COM invocable es una tarea sencilla. Si el tipo que desea exponer a un cliente COM tiene requisitos no estándar para el cálculo de referencias, aplique el atributo System.Runtime.InteropServices.MarshalAsAttribute a un parámetro de un método, un campo de una clase o un valor devuelto para cambiar el comportamiento del cálculo de referencias.
Como se muestra en la ilustración siguiente, puede exportar un archivo DLL administrado sin personalizar el contenedor (se muestra a la izquierda). O bien, puede agregar información de cálculo de referencias al origen, compilarlo y utilizar la herramienta Exportador de la biblioteca de tipos (Tlbexp.exe) para exportar el archivo DLL modificado y generar un contenedor personalizado.
Información de cálculo de referencias en archivos DLL exportados
Nota |
---|
Todos los tipos, métodos, propiedades, campos y eventos administrados que desee exponer a COM deben ser públicos.Los tipos deben tener un constructor predeterminado público, que es el único al que se puede llamar mediante COM.Para obtener información adicional, vea Habilitar tipos de .NET para la interoperación. |
Al calcular referencias de datos entre código administrado y no administrado, el contador de referencias de interoperabilidad debe reconocer las representaciones de los datos que se pasan:
Si los tipos se pueden representar como bits o bytes, las representaciones administrada y no administrada son siempre las mismas. Por ejemplo, un entero de 4 bytes se calcula siempre como un entero de 4 bytes. El contador de referencias de interoperabilidad utiliza la firma administrada para determinar la representación de datos.
En el caso de los tipos que no se pueden representar como bits/bytes, el contador de referencias de interoperabilidad reconoce la representación administrada de la firma de su método, pero no puede hacer lo mismo para la representación no administrada. Para calcular referencias de tipos que no se pueden representar como bits/bytes, puede utilizar una de las técnicas siguientes:
Permitir que el contador de referencias infiera la representación a partir de la representación administrada.
Proporcionar la representación de datos no administrada explícitamente.
Por ejemplo, una cadena se convierte en un tipo BSTR cuando se calculan las referencias de código administrado a no administrado, a menos que aplique explícitamente MarshalAsAttribute para calcular la cadena como otro tipo, como LPWSTR. Puede aplicar este atributo a un parámetro, campo o valor devuelto dentro del origen de la definición de tipo, como se muestra en los siguientes ejemplos.
Aplicar MarshalAsAttribute a un parámetro
Public Sub M1(<MarshalAs(UnmanagedType.LPWStr)> msg As String)
' ...
End Sub
void M1([MarshalAs(UnmanagedType.LPWStr)] string msg)
{
// ...
}
void M1([MarshalAs(UnmanagedType::LPWStr)] String^ msg)
{
// ...
}
Aplicar MarshalAsAttribute a un campo de una clase
Class MsgText
<MarshalAs(UnmanagedType.LPWStr)> _
Public msg As String = ""
End Class
class MsgText
{
[MarshalAs(UnmanagedType.LPWStr)]
public string msg = "";
}
ref class MsgText
{
public:
[MarshalAs(UnmanagedType::LPWStr)]
String^ msg;
MsgText()
{
msg = "";
}
};
Aplicar MarshalAsAttribute a un valor devuelto
Public Function M2() As <MarshalAs(UnmanagedType.LPWStr)> String
Dim msg As New String(New char(128){})
' Load message here ...
Return msg
End Function
[return: MarshalAs(UnmanagedType.LPWStr)]
public string GetMessage()
{
string msg = new string(new char[128]);
// Load message here ...
return msg;
}
[returnvalue: MarshalAs(UnmanagedType::LPWStr)]
String^ GetMessage()
{
String^ msg = gcnew String(gcnew array<Char>(128));
// Load message here ...
return msg;
}
La enumeración System.Runtime.InteropServices.UnmanagedType se establece para indicar el formato deseado del tipo no administrado. En las firmas anteriores se calculan referencias de los datos msg como un búfer terminado en null de caracteres Unicode (LPWStr).
Algunas veces, el contador de referencias de interoperabilidad requiere más información de la proporcionada por el formato de datos administrados y no administrados. Por ejemplo, para calcular las referencias de una matriz debe proporcionar el tipo de elemento, el rango, el tamaño y los límites de la matriz. Puede utilizar MarshalAsAttribute para especificar otra información adicional necesaria.
Vea también
Referencia
Personalizar contenedores COM invocables