Publié le : 24/06/2025

Déclencher des événements PowerBuilder depuis C# : guide complet du pont pbdotnetinvoker

déclencher des événements PowerBuilder depuis C#

Depuis PowerBuilder 2022 R3 (build 3391), Appeon fournit un pont natif, pbdotnetinvoker.dll, qui permet à un assembly .NET 6/8 (ou, si l’on préfère, .NET 4.8 via pbdotnetframeworkinvoker.dll) de déclencher des évènements au cœur d’une application PowerBuilder 32 bits depuis C#.
Ce mécanisme s’appuie sur la classe statique PowerBuilder.RegisteredObject, exposée par l’invoker : côté PB on enregistre la fenêtre ou l’objet cible avec RegisterObject, côté C# on déclenche le callback avec TriggerEvent.

Avant de plonger dans la technique, situons la finalité : montrer comment relier un module C# moderne à une interface PowerBuilder existante, sans passer par du COM ni du socket, en utilisant uniquement le pont officiel Appeon.
Plus précisément, nous allons :

  • Préparer l’application PowerBuilder pour recevoir un événement .NET ;
  • Créer une DLL C# compatible (x86) qui appellera TriggerEvent ;
  • Tester la chaîne complète et lister les bonnes pratiques de déploiement et de débogage.

Voici les étapes essentielles pour déclencher des évènements PowerBuilder depuis C# via pbdotnetinvoker, depuis les pré-requis jusqu’aux bonnes pratiques :

  1. Pré-requis rapides
  2. Architecture du mécanisme pbdotnetinvoker
  3. Étape A : Préparer le côté PowerBuilder
  4. Étape B : Créer l’assembly C# (EventBridge)
  5. Étape C : Déclencher l’événement et vérifier le retour
  6. Déploiement & dépendances
  7. Débogage et pièges fréquents
  8. Conclusion & bonnes pratiques

1. Pré-requis rapides

OutilVersion min.
PowerBuilder IDE2022 R3 build 3391 (pour .NET 8) ou 3356 (pour .NET 6)
Runtime PB distribuémême build que l’IDE
SDK .NET x866.0 ou 8.0 (selon le choix)
Visual Studio2019 (v16.11) ou 2022 (recommandé)

Important : compile toujours la DLL C# en x86 (ou AnyCPU + Prefer 32-bit).

2. Architecture du mécanisme

Mécanisme pour déclencher des événements PowerBuilder depuis C#
  1. EventBridge appelle TriggerEvent("objet", "ue_callback", "payload").
  2. pbdotnetinvoker relaye l’appel.
  3. PowerBuilder retrouve l’objet enregistré et exécute le user-event demandé.

3. Étape A : Préparer PowerBuilder

3.1 – Créer une NVO de gestion .NET

global type nvo_dotnetmanager from nonvisualobject
    autoinstantiate=true
    DotNetAssembly inv_ass
    DotNetObject  inv_obj
end type

Dans le constructor :

integer li_ret
string  ls_dll = "eventbridge.dll"   // chemin réel

inv_ass = create DotNetAssembly
li_ret  = inv_ass.LoadWithDotNetCore(ls_dll)   // ou LoadWithDotNet()

li_ret  = inv_ass.CreateInstance("PBInterop.Test.EventBridge", inv_obj)
IF li_ret <> 1 THEN
    MessageBox("Init .NET", "Erreur " + String(li_ret) + "~r~n" + inv_ass.ErrorText)
END IF

3.2 – User-event destinataire

Dans la fenêtre w_main :

event ue_callback (string as_msg)
    MessageBox("Callback C#", as_msg)
end event

3.3 – Enregistrer l’objet

// w_main.Open
integer li_reg
li_reg = gnv_dotnetmanager.inv_obj.RegisterObject("w_main", this)

4. Étape B : Créer l’assembly C#

4.1 – Paramètres clés

  • Framework : net6.0-windows ou net8.0-windows
  • Platform target : x86
  • Copier pbdotnetinvoker.dll dans le projet, Copy Local = True.

4.2 – Classe EventBridge (extrait)

using PowerBuilder;

namespace PBInterop.Test
{
    public class EventBridge
    {
        public string Ping(string msg = "Hello PB!")
        {
            int rc = RegisteredObject.TriggerEvent("w_main", "ue_callback", msg);
            return rc == 1 ? "OK" : $"Erreur RC={rc}";
        }
    }
}

5. Étape C : Déclencher et vérifier les événements PowerBuilder venant de C#

// depuis un bouton PowerBuilder
string ls_ret
ls_ret = gnv_dotnetmanager.inv_obj.Method("Ping", "Appel depuis PB ▼")
MessageBox("Retour C#", ls_ret)

Deux boîtes de dialogue s’enchaînent :

  1. le message du user-event (« Callback C# ») ;
  2. le retour de la méthode C# (« OK »).

6. Déploiement & dépendances

app.exe
runtime\*.dll            (PBVM + dll system)
eventbridge.dll
eventbridge.pdb          (facultatif)
pbdotnetinvoker.dll

Une seule copie de pbdotnetinvoker.dll ! Évite les doublons dans System32.

Il faut privilégier l’utilisation du dll fournit avec le runtime de PowerBuilder, comme ça on utilise le même dll.

7. Débogage et pièges fréquents

Code retourSignificationAction
-5DotNetObject non instanciéRevoir LoadWithDotNet(Core) et le chemin DLL
-50 / -51Nom d’objet invalide / non trouvéVérifier casse + RegisterObject=1
-52Objet pas enregistré (tables différentes)Assurer qu’un seul invoker est chargé (pbdotnetinvoker.dll
BadImageFormatx64 vs x86Recompiler la DLL en x86

Breakpoints gris ? Copie le .pdb ou passe en DebugType=embedded.

8. Conclusion & bonnes pratiques pour déclencher des événements PowerBuilder depuis C#

  1. Un seul invoker par projet (Framework → pbdotnetframeworkinvoker, Core → pbdotnetinvoker).
  2. x86 partout : PB est 32 bits.
  3. Toujours désenregistrer l’objet dans Close: powerscriptCopierModifiergnv_dotnetmanager.inv_obj.UnregisterObject("w_main")
  4. Centraliser la gestion .NET dans une NVO singleton simplifie maintenance et débogage.
  5. Prévoir une branche .NET 6/8 pour l’avenir : .NET 4.8 sera supporté jusqu’en 2029 seulement.

Avec ces repères, tu peux faire dialoguer efficacement C# et PowerBuilder, moderniser ta logique métier sans toucher aux écrans existants et conserver un processus de build clair, débogable et pérenne.

8. Liens utiles

Voici les différentes liens qui m’ont permis de faire fonctionner la communication par évènement entre C# et PowerBuilder :

Les mots clés rattachés à cet article : C#  -  PowerBuilder

Nos clients

Une vingtaine de clients nationaux et internationaux