example - Convierta una simple DLL C#en un componente de interoperabilidad COM
summary example c# (4)
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 objetivo 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/
¿Cómo puedo hacer una DLL C # en una DLL de interoperabilidad COM que puede ser consumida por una aplicación VB6?
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
Esta es la respuesta que quería encontrar en 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 programació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 Compilar> "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 compilación. Este es el método que utilicé.
- No marque Propiedades del proyecto> ficha Compilació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 resto 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.