Transformer un simple C # DLL en un composant COM interop

Comment faire un C# DLL dans un COM interop DLL qui peut être consommé par une application VB6?

59
demandé sur tomRedox 2011-08-17 16:12:10

4 réponses

C'est la réponse que je voulais trouver dans StackOverflow mais je n'ai pas pu. Il s'avère être assez facile de transformer un simple c # dll en un COM dll.

pour créer le C# dll

créer une solution avec un projet C# class. La classe doit avoir une interface pour les propriétés/méthodes et une interface pour les événements. Attribuer les attributs GUID à la classe et aux interfaces comme décrit dans MSDN - exemple de classe COM (C # Guide de programmation) . Voir aussi: MSDN - Comment: déclencher des Événements Gérés par un récepteur COM .

dans Propriétés du projet > onglet Application > bouton Information D'assemblage > cochez"Make assembly COM-Visible". Cela rend toutes les méthodes publiques dans la classe COM visible.

Dans les Propriétés du Projet > onglet créer > Définir la "Plate-forme cible" pour x86.

C'est tout ce que vous devez faire pour créer la DLL. Pour appeler la DLL, vous devez l'enregistrer.

Enregistrer la DLL sur votre machine de développement

vous pouvez enregistrer la DLL de ces façons:

  • vérifier les propriétés du projet > Build Tab > "S'inscrire pour COM Interop". Cela enregistrera automatiquement la DLL lorsque vous la construirez.
  • enregistrer manuellement la DLL avec RegAsm. Cette option permet d'enregistrer la DLL dans le répertoire de votre choix, plutôt que dans la construction répertoire. C'est la méthode que j'ai utilisé.

    • ne pas vérifier les propriétés du projet > onglet Construire > "S'inscrire pour COM Interop"
    • copier la DLL dans l'annuaire où vous voulez l'enregistrer""
    • Ouvrir une invite de commandes avec des droits d'administrateur et tapez

      RegAsm.exe -tlb -codebase mydll.dll
      

      RegAsm.exe peut être trouvé dans "C:\Windows\Microsoft.NET\Framework\v2.0.50727", alors que "madll.dll" est le nom de votre DLL; tlb signifie "créer une bibliothèque de type"; codebase signifie"écrire l'emplacement du répertoire dans le Registre, en supposant qu'il n'est pas placé dans le GAC".

      RegAsm affichera un avertissement que l'assemblée devrait être nommée fort. Vous pouvez l'ignorer.

      à ce point, vous devriez être en mesure d'ajouter une référence à la DLL COM dans VB6, voir avec Intellisense, et exécuter comme un DLL COM régulier.

installation de la DLL avec InstallShield

si vous utilisez InstallShield pour installer la DLL avec le reste de votre application, faire ce qui suit.

dans InstallShield, ajouter un nouveau composant à la liste des composants. N'oubliez pas d'associer le composant à une fonctionnalité. Définir la propriété component ".NET COM Interop" à Yes.

ajouter le .fichier dll vers les fichiers section du composant. Ne Vérifiez pas la propriété" Self-Register". Cliquez-droit sur le .dll fichier et sélectionnez "Définir fichier clé".

ajouter le .fichier tlb à la section Fichiers du Composant. Cochez la case "Auto-Inscription" propriété.

la version correcte du .net Framework doit exister sur le PC cible.

C'est ça.

77
répondu Kieren Johnstone 2015-09-08 14:14:03

comme extension de @Kieren Johnstone répondez à un exemple de code pratique sur les modifications de classe que vous devez faire:

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; }

}

à:

[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; }

}

Espère que cela vous permet d'économiser un peu de temps

3
répondu Matas Vaitkevicius 2017-04-06 06:26:03

Microsoft a un rapide comment ici . Toutefois, vous aurez besoin d'enregistrer la dll. Pour faire votre C# dll plus comme un simple c dll (C# Unmanaged Exports), utilisez cette "méthode 151920920", qui est décrit en détail ici .

1
répondu pcunite 2015-07-31 16:57:18

COM Interop est une technologie incluse dans le .net Framework Common Language Runtime (CLR) qui permet aux objets Component Object Model (COM) d'interagir avec les objets .NET, et vice versa. COM Interop vise à fournir l'accès aux composants COM existants sans exiger que le composant original soit modifié et vice-versa. Plus à l': http://www.writeulearn.com/com-interop-using-csharp/

0
répondu bhupesh 2016-07-20 18:06:59