Convierta una simple DLL C # en un componente de interoperabilidad COM

¿Cómo puedo hacer una DLL C # en una DLL de interoperabilidad COM que puede ser consumida por una aplicación VB6?

Esta es la respuesta que quería encontrar en StackOverflow pero no pude. Resulta bastante fácil convertir un simple dll C # en un COM dll.

Para crear el C # dll

Crea una solución con un proyecto de clase C #. La clase debe tener una interfaz para las propiedades / métodos y una interfaz para los eventos. Asigne atributos GUID a la clase y las interfaces como se describe en MSDN – Ejemplo de clase COM (Guía de progtwigción C #) . También vea: MSDN – Cómo: Levantar eventos manejados por un fregadero COM .

En Propiedades del proyecto> pestaña Aplicación> botón Información de ensamblaje> marque “Hacer ensamblar COM-Visible”. Esto hace que todos los métodos públicos en la clase COM sean visibles.

En Propiedades del proyecto> pestaña Construir> Establecer “Objetivo de la plataforma” en x86.

Eso es todo lo que necesita hacer para crear la DLL. Para llamar a la DLL, debe registrarla.

Registrando el DLL en su máquina de desarrollo

Puede registrar el DLL de una de estas maneras:

  • Verifique Propiedades del proyecto> Ficha Comstackr> “Registrar para interoperabilidad COM”. Esto registrará automáticamente la DLL cuando la construya.
  • Manualmente registra la DLL con RegAsm. Esto le permite registrar la DLL en el directorio de su elección, en lugar de en el directorio de comstackción. Este es el método que utilicé.

    • No marque Propiedades del proyecto> ficha Comstackción> “Registrarse para la interoperabilidad COM”
    • Copie el archivo DLL al directorio donde desea registrarlo
    • Abra un shell de comando con derechos de administrador y escriba

      RegAsm.exe -tlb -codebase mydll.dll 

      RegAsm.exe se puede encontrar en “C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727”, mientras que “mydll.dll” es el nombre de su DLL; tlb significa “crear una biblioteca de tipos”; codebase significa “escribir la ubicación del directorio en el Registro, suponiendo que no se está colocando en el GAC”.

      RegAsm mostrará una advertencia de que el conjunto debe tener un nombre fuerte. Puedes ignorarlo

      En este punto, debería poder agregar una referencia a la DLL COM en VB6, verla con Intellisense y ejecutarla como una DLL COM normal.

Instalación de la DLL con InstallShield

Si está utilizando InstallShield para instalar el archivo DLL junto con el rest de su aplicación, haga lo siguiente.

En InstallShield, agregue un nuevo Componente a la lista de Componentes. Recuerde asociar el Componente con una Característica. Establezca la propiedad del componente “.NET COM Interop” en Sí.

Agregue el archivo .dll a la sección Archivos del Componente. No marque la propiedad “Autorregistrarse”. Haga clic derecho en el archivo .dll y seleccione “Establecer archivo de clave”.

Agregue el archivo .tlb a la sección Archivos del Componente. Verifique la propiedad “Autorregistrarse”.

La versión correcta de .Net Framework debe existir en la PC de destino.

Eso es.

Como extensión de @Kieren, Johnstone responde un ejemplo de código práctico sobre modificaciones de clase que debe hacer:

De:

 public class ApiCaller { public DellAsset GetDellAsset(string serviceTag, string apiKey) { .... } } public class DellAsset { public string CountryLookupCode { get; set; } public string CustomerNumber { get; set; } public bool IsDuplicate { get; set; } public string ItemClassCode { get; set; } public string LocalChannel { get; set; } public string MachineDescription { get; set; } public string OrderNumber { get; set; } public string ParentServiceTag { get; set; } public string ServiceTag { get; set; } public string ShipDate { get; set; } } 

A:

 [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")] [ComVisible(true)] public interface IComClassApiCaller { IComClassDellAsset GetDellAsset(string serviceTag, string apiKey); } [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] [ComVisible(true)] public interface IComClassApiCallerEvents { } [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IComClassApiCallerEvents))] [ComVisible(true)] [ProgId("ProgId.ApiCaller")] public class ApiCaller : IComClassApiCaller { public IComClassDellAsset GetDellAsset(string serviceTag, string apiKey) { ..... } } [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83E")] [ComVisible(true)] public interface IComClassDellAsset { string CountryLookupCode { get; set; } string CustomerNumber { get; set; } bool IsDuplicate { get; set; } string ItemClassCode { get; set; } string LocalChannel { get; set; } string MachineDescription { get; set; } string OrderNumber { get; set; } string ParentServiceTag { get; set; } string ServiceTag { get; set; } string ShipDate { get; set; } } [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA70"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] [ComVisible(true)] public interface IComClassDellAssetEvents { } [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F937"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IComClassDellAssetEvents))] [ComVisible(true)] [ProgId("ProgId.DellAsset")] public class DellAsset : IComClassDellAsset { public string CountryLookupCode { get; set; } public string CustomerNumber { get; set; } public bool IsDuplicate { get; set; } public string ItemClassCode { get; set; } public string LocalChannel { get; set; } public string MachineDescription { get; set; } public string OrderNumber { get; set; } public string ParentServiceTag { get; set; } public string ServiceTag { get; set; } public string ShipDate { get; set; } } 

Espero que esto te ahorre algo de tiempo

Microsoft tiene un rápido cómo hacerlo aquí . Sin embargo, deberás registrar el dll. Para hacer que su C # dll sea más parecido a un simple dll C (C # Exportaciones no administradas), use este método, que se describe en detalle aquí .

COM Interop es una tecnología incluida en Common Language Runtime (CLR) de .NET Framework que permite que los objetos del Modelo de Objetos Componentes (COM) interactúen con objetos .NET, y viceversa. COM Interop tiene como objective proporcionar acceso a los componentes COM existentes sin requerir que el componente original se modifique y viceversa. Más en: http://www.writeulearn.com/com-interop-using-csharp/