Clase COM de ejemplo
El código siguiente es un ejemplo de una clase que se expondría como un objeto COM. Una vez que coloque este código en un archivo .cs agregado al proyecto, establezca la propiedad Registrar para interoperabilidad COM en True. Para obtener más información, vea Cómo: Registrar un componente para interoperabilidad COM.
Exponer objetos de C# para COM requiere declarar una interfaz de clase, una "interfaz de eventos" si es necesario y la propia clase. Los miembros de clase deben seguir estas reglas para que sean visibles en COM:
- La clase debe ser pública.
- Las propiedades, métodos y eventos deben ser públicos.
- Las propiedades y métodos deben declararse en la interfaz de clase.
- Los eventos deben declararse en la interfaz de eventos.
Los demás miembros públicos de la clase que no declare en estas interfaces no serán visibles para COM, pero lo serán para otros objetos de .NET. Para exponer propiedades y métodos en COM, se deben declarar en la interfaz de clase y marcar con el atributo DispId
, e implementarlos en la clase. El orden en que se declaran los miembros en la interfaz es el orden que se usa para la tabla virtual de COM. Para exponer los eventos de la clase, se deben declarar en la interfaz de eventos y marcarlos con un atributo DispId
. La clase no debe implementar esta interfaz.
La clase implementa la interfaz de clase y puede implementar más de una interfaz, pero la primera implementación es la interfaz de clase predeterminada. Implemente los métodos y propiedades expuestos para COM aquí. Deben ser públicos y coincidir con las declaraciones de la interfaz de clase. Asimismo, declare los eventos iniciados por la clase aquí. Deben ser públicos y coincidir con las declaraciones de la interfaz de eventos.
Ejemplo
using System.Runtime.InteropServices;
namespace project_name
{
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public interface ComClass1Interface
{
}
[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ComClass1Events
{
}
[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ComClass1Events))]
public class ComClass1 : ComClass1Interface
{
}
}