2010-08-18 2 views
4

J'ai un problème avec les objets COM et les événements déclencheurs. J'ai:Problème lors du déclenchement d'événements dans une DLL .NET via COM depuis Delphi

  • une DLL écrite en C# .NET (3.5), ce qui déclenche des événements
  • une application dans Delphi5, qui utilise la DLL comme un objet COM.

Jusqu'ici tout va bien. Les événements vont comme ceci: - dans la DLL il y a 2 événements. L'un est interne et n'est pas COM-visible. Le second est externe et est visible par COM - il existe également une fonction OnChanged dans la DLL, qui est connectée à l'événement interne et déclenche l'événement externe. Donc, fondamentalement, chaque fois que l'événement interne est déclenché, l'événement externe l'est également. - cette fonction onChanged est également COM visible et peut être appelé à partir de l'application Delphi

J'utilisé this solution pour obtenir le travail toute chose, je peux lier avec succès une procédure Delphi à l'événement .NET, mais il y a un hic: - si j'appelle OnChanged de l'application Delphi, tout est peachy - la fonction Delphi liée sera exécutée ainsi que (évidemment) la fonction .NET - si la DLL appelle OnChanged à partir d'une fonction de rappel dans .NET, la fonction Delphi liée ne sera pas exécuté. Bottomline: si je déclenche l'événement externe à partir de Delphi, tout est OK. Si la DLL déclenche l'événement interne, rien ne se passera dans Delphi (bien que l'événement externe soit bien sûr déclenché).

Toutes les idées sont très appréciées!

+0

Pouvez-vous fournir du code et confirmer que vous avez fait tout ce qui a été donné dans la réponse du sujet StackOverflow que vous avez donné? –

+0

Voici un exemple complet pour vous aider à démarrer http://www.systemwidgets.com/Blog/tabid/61/articleType/ArticleView/articleId/271/C-COM-server-to-Delphi-COM-clients.aspx –

Répondre

0

Il est très difficile d'y répondre sans déboguer le code, mais je vais vous parler d'un problème que j'ai rencontré dans le passé avec COM interop.

Une possibilité que vous pourriez vouloir divertir est que le raccordement d'événement soit libéré par le GC. Lorsque vous vous attachez à un événement sur un objet, cet événement prend généralement une référence sur l'attacher et les deux objets ne sont pas nettoyés par le GC, mais lorsque vous avez un objet COM, le GC ne connaît pas nécessairement cette référence et il peut nettoyer l'un des objets. Je l'ai déjà rencontré dans le passé avec Office Automation via .net. La façon de résoudre cela est de conserver la référence à l'objet COM et de s'y attacher.

Par exemple, ce qui est mauvais:

public class Foo 
{ 
    public Foo(ICOMObject obj) 
    { 
    obj.Changed += OnChanged; 
    } 

    private void OnChanged(object arg) 
    { 
    } 
} 

Cela fonctionne très bien si obj est un objet .net. L'événement restera accroché tant que l'un des objets reste référencé. Cependant cela ne fonctionnera pas avec un objet COM. Avec un objet COM, l'événement semble s'arrêter de fonctionner à un moment donné, généralement plutôt rapidement.

Essayez plutôt ceci:

public class Foo 
{ 
    ICOMObject obj; 
    public Foo(ICOMObject obj) 
    { 
    this.obj = obj; 
    this.obj.Changed += OnChanged; 
    } 

    private void OnChanged(object arg) 
    { 
    } 
} 

Je ne suis pas sûr que ce soit votre problème, mais il pourrait être. Bonne chance!

Questions connexes