Objet Com C# réutilisé en delphi
Bonjour,
je dois, pour mon travail, écrire du code c# et pouvoir utiliser les methodes dans un programme delphi. J'esperais dans un premier temps faire une dll mais j'ai cru comprendre que ce n'etait pas possible. Je précise que je débute totalement en C#, je traine depuis plusieurs heures sur les forums/tutoriels pour tenter de faire un objet com tout simple mais bien entendu ca ne marche pas.
J'ai créé un nouveau projet en tant que "Bibliotheque de classes" et j'ai le code tout simple suivant (dans un premier temps je veux juste faire fonctionner un truc simplissime, je verrai le reste plus tard):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
using System;
namespace testDll
{
public class Human
{
int age;
public int Age { get { return age; } set { age = value; } }
public Human()
{
age = 0;
}
public void Anniversaire()
{
age++;
}
}
} |
J'ai bien coché "Inscrire pour COM Interop" et j'ai bien modifié la valeur [assembly: ComVisible(true)] dans AssemblyInfo.cs
A la génération, j'ai bien un fichier tlb que je peux importer dans delphi, mais si je peux instancier un objet Human, je n'ai pas accès ni à la proriété age ni à la methode Anniversaire:
Est ce que quelqu'un pourrait m'éclairer sur la (ou plus certainement les) erreur(s) commise(s).
Merci d'avance
exposer une classe com ,ne pas exposer l'interface
bonjour pixigol
Il est preferable d'exposer ta classe com par le biais d'une interface,sans pour autant publier l'interface pour eviter que les gens modifient ta classe plus tard en implement une autre forme de classe.
Pour cela :
-declare une interface InterfaceHuman avec attribut InterfaceIsIDispatch.
-declare ta classe Human qui implement l' interface InterfaceHuman avec attribut ClassInterface(ClassInterfaceType.None).
-implemente ta classe Human
Utilise l'outils GuidGen de vs pour recreer tes 3 numeros "Guid" dans :
Outils ->Create GUID->New GUID ->copy et paste dabs l'editeur VS trois fois
(interface InterfaceHuman,EventsHuman et class Human).
Pour -deboguer seulement sur ta machine- n'oublies de cocher Inscrire pour Com Interop.
L'inscription sur machine user se fait avec l'utilitaire Regasm.exe de VS.
Voici le code de ta classe Human :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
//rappel guide MSDN
//L'exposition d'objets Visual C# à COM requiert la déclaration d'une interface de classe, d'une interface d'événement, si elle est requise, et de la classe elle-même. Les membres de la classe doivent se conformer aux règles suivantes pour être visibles par COM :
//La classe doit être publique.
//Les propriétés, les méthodes et les événements doivent être publics.
//Les propriétés et les méthodes doivent être déclarées sur l'interface de classe.
//Les événements doivent être déclarés dans l'interface d'événements.
//NB:Les autres membres publics de la classe qui ne sont pas déclarés dans ces interfaces ne seront pas visibles pour COM,
//mais seront visibles pour d'autres objets .NET Framework.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace testDll
{
//Pour exposer des propriétés et des méthodes à COM, vous devez les déclarer dans l'interface de classe,
//les marquer avec l'attribut DispId et les numeroter progressivement et les implémenter dans la classe.
//L'ordre dans lequel les membres sont déclarés dans l'interface est l'ordre utilisé pour la vtable COM.
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
//Recreer S.V.P ce GUID avec utilitaire GuidGen dans Outils.
[Guid("B7047F1B-A70D-4352-91E3-D95464A63EC0")]
public interface InterfaceHuman
{
[DispId(1)] int Age { get; set;}
[DispId(2)] void Anniversaire();
}
//Pour exposer des événements à partir de votre classe,
//vous devez les déclarer sur l'interface d'événements et les marquer avec un attribut DispId.
//nb:La classe ne doit pas implémenter cette interface.
//
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
//Recreer S.V.P ce GUID avec utilitaire GuidGen dans Outils.
[Guid("0B1F9044-8E79-48ef-BE2A-D199DB77DC39")]
public interface EventsHuman
{
}
//Recreer S.V.P ce GUID avec utilitaire GuidGen dans Outils.
[ComVisible(true), Guid("75917281-4FEC-435d-AA05-EF86D7DCC5AB"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(EventsHuman))]
[ProgId("testDll.Human")]
//Declaration de la Classe Human et d'autres classes si tu veux............
//qui implementent ton interface InterfaceHuman
public class Human : InterfaceHuman
{
public Human()
{
age = 20;
}
//ici les prop et methodes visibles uniquement à .Net
//Net non visible à com
int ageNet;
public int AgeNet { get { return ageNet; } set { ageNet = value; } }
public void AnniversaireNet()
{
age++;
}
//
//ici les prop et methodes visibles à com
//
#region InterfaceHuman Membres
//implement prop int Age
int age;
public int Age { get { return age; } set { age = value; } }
//implement methode Anniversaire
public void Anniversaire()
{
age++;
}
#endregion
}
} |
bon code................