¿Cómo puedo hacer un C# archivo DLL en un COM interop DLL que puede ser consumido por una aplicación VB6?

4 Comentarios

  1. 85

    Esta es la respuesta que yo quería encontrar en StackOverflow, pero no podía. Resulta bastante fácil de convertir una simple C# dll en una dll COM.

    Para crear el C# dll

    Crear una solución con una clase de C# proyecto. La clase debe tener una interfaz para los métodos y propiedades y una interfaz para los eventos. Asignar GUID atributos de la clase y las interfaces como se describe en MSDN – Ejemplo de Clase COM (C# Guía de Programación). Véase también: MSDN – Cómo: crear Eventos controlados por un receptor COM.

    En Propiedades del Proyecto > pestaña Aplicación > Información de la Asamblea botón > verificación de «Hacer de la asamblea COM-Visible». Esto hace que todos los métodos públicos de la clase COM visible.

    En Propiedades del Proyecto > Construir tab > Set «de la Plataforma de destino» para x86.

    Que es todo lo que usted necesita hacer para crear la DLL. Llamar a la DLL, usted necesita para registrarlo.

    Registrar la DLL en el equipo de desarrollo

    Usted puede registrar el archivo DLL una de estas maneras:

    • De verificación de Propiedades del Proyecto > Construir Tab > «Registrar para Interoperabilidad COM». Esto registrará automáticamente el archivo DLL cuando se genera.
    • Registrar manualmente el archivo DLL con la RegAsm. Esto le permite registrar la DLL en el directorio de su elección, en lugar de en el directorio de construcción. Este es el método que he utilizado.

      • No de verificación de Propiedades del Proyecto > Construir Tab > «Registrar para Interoperabilidad COM»
      • Copiar el archivo DLL al directorio donde desea registrarlo
      • Abra un shell de comandos 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 del DLL; tlb significa «crear una biblioteca de tipo»;
        codebase significa «escribir la ubicación del directorio en el Registro, asumiendo que no es la de ser colocado en el GAC».

        RegAsm mostrará una advertencia de que la asamblea debe ser un nombre seguro. Se puede omitir.

        En este punto, usted debería ser capaz de añadir una referencia a la DLL de COM en VB6, consulte con Intellisense, y ejecutarlo como un regular de DLL de COM.

    Instalar la DLL con InstallShield

    Si usted está usando InstallShield para instalar el archivo DLL junto con el resto de la aplicación, haga lo siguiente.

    De InstallShield, agregar un nuevo Componente a la lista de Componentes. Recuerde que para asociar el Componente con una Característica.
    Conjunto de componentes de la propiedad «.RED de Interoperabilidad COM» a Sí.

    Agregar el .dll archivo a la sección Archivos del Componente.
    No marque la casilla de «Auto-» el Registro de la propiedad.
    Haga clic en el .archivo dll y seleccione «Archivo de Clave».

    Agregar el .tlb archivo a la sección Archivos del Componente.
    Marque la casilla de «Auto-» el Registro de la propiedad.

    La versión correcta de la .Net Framework necesidades que existen en el PC de destino.

    Que es.

    • Estoy usando InstallSheild 11.5 y no veo «.RED de Interoperabilidad COM» opción. El archivo de ayuda que el 11.5 viene con no decir que debería estar allí, así que no sé si estoy viendo el punto de vista equivocado o qué. Puede actualizar su respuesta a incluir en donde que establece la propiedad?
    • El uso de InstallShield de 2011, en la Organización de los Componentes del árbol hay una sección para .NETO Ajustes, que incluye el .NET COM Interop configuración.
    • su respuesta realmente útil.
    • Cuando intento hacer referencia a la DLL en el VB6 IDE me aparece el error: «no se Puede agregar una referencia al archivo especificado». Debo hacer referencia a la DLL o el archivo TLB?
    • Impresionante respuesta, me perdí la parte en -tlb -codebase. Arruinó mi cabeza sobre esto por un par de horas hasta que me encontré con este. Gracias!
    • Excelente respuesta. La clave para mí fue «Hacer de la asamblea COM-Visible», que no he visto en ningún otro tutorial en línea para este proceso. Gran trabajo. Gracias
    • advertencia MSB3214: «……\CsComLib.dll» no contiene tipos que se pueden registrar para Interoperabilidad COM.
    • error MSB3213: No se puede registrar el tipo de biblioteca «……\CsComLib.tlb». Error de acceso al registro OLE.
    • regsvr32 punto de entrada no encontrado

  2. 4

    Como en extensión a @Kieren Johnstone la respuesta un práctico ejemplo de código en la clase de modificaciones que hay que 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 ahorra mucho tiempo

    • Gracias por el ejemplo! Cómo te gustaría ser capaz de llamar a GetDellAsset en VB6 si usted está tratando de acceder a la clase a través de CreateObject?
    • Hola, echa un vistazo a este stackoverflow.com/questions/345178/…
  3. 1

    Microsoft tiene una guía rápida para la aquí. Sin embargo, usted tendrá que registrar la dll. Para hacer de su C# dll más como un simple archivo dll de C (C# no administrado de las Exportaciones), el uso de este método, la cual se describe en detalle aquí.

  4. 0

    De Interoperabilidad COM es una tecnología incluida en el .NET Framework Common Language Runtime (CLR), que permite que el Modelo de Objetos Componentes (COM) de los objetos para interactuar con ellos .NETO de los objetos, y viceversa. Interoperabilidad COM se pretende dar acceso a la existente componentes COM sin necesidad de que el componente original de ser modificados y vice-versa.
    Más información en:
    http://www.writeulearn.com/com-interop-using-csharp/

Dejar respuesta

Please enter your comment!
Please enter your name here