2017-02-17 2 views
-1

En C#, j'ai une classe et son interface dans ma solution, et je veux qu'ils soient COM visibles.Delphi 7 ne générant pas de classes COM lors de l'importation de la bibliothèque de types

J'ai:

  1. créé l'interface et la classe comme suit:

    [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("0D1ABB24-144E-4C88-A4A5-DC3ED0E61BEB")] 
    [ComVisible(true)] 
    public interface IMyInterface 
    { 
        // methods here 
    } 
    
    [ClassInterface(ClassInterfaceType.None), Guid("01AA5822-83D1-42C6-A578-C9A84AB836AA")] 
    [ComVisible(true)] 
    public class MyClass : IMyInterface 
    { 
        // implementation here 
    } 
    

    (notez qu'ils sont à la fois COM visible)

  2. a généré un GUID et informé en l'Assemblée Info:

    [assembly: Guid("MY-GUID-HERE")] 
    
  3. il inscrit sur cette ligne de commande:

    c:\regasm.exe /tlb MyAssembly.Dll 
    
  4. Importé la bibliothèque de type Delphi 7.

Une unité est générée, mais il ne contient pas la classe et les fonctions/procédures. L'appel CoClass.Create a renvoyé une erreur "Classe non enregistrée".

Plus tard, j'ai créé une nouvelle solution avec une bibliothèque de classes, en effectuant les mêmes opérations ci-dessus, et les classes/méthodes où je pouvais y accéder.

Y at-il des conseils sur ce que j'ai pu manquer?

+0

Vous devriez essayer d'ajouter l'option/codebase à votre commande regasm. En outre, votre DLL et votre projet Delphi doivent être à la fois 32 bits ou les deux 64 bits. J'essaie généralement de tester l'enregistrement de la DLL en utilisant un script VBS pour créer l'objet. Si vous construisez une DLL 32 bits, vous devez être sûr d'utiliser cscript.exe ou wscript.exe dans c: \ windows \ syswow64 - en supposant un système d'exploitation 64 bits. –

+1

En outre, utilisez Oleview pour essayer et ouvrir le fichier TLB généré pour voir à quoi il ressemble - en supposant que vous avez visual studio. Je ne connais pas les outils livrés avec Delphi qui feraient la même chose. –

Répondre

0

J'ai découvert la différence. Une classe TLB que je voulais exporter avait des constructeurs dans une région. Quand je l'ai développé, j'ai vu qu'il n'y avait pas de constructeur surchargé sans paramètres. Après avoir ajouté un constructeur sans argument, il était visible à Delphi et je pouvais l'utiliser normalement.