Publié le : 24/06/2025
Déclencher des événements PowerBuilder depuis C# : guide complet du pont pbdotnetinvoker

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 :
- Pré-requis rapides
- Architecture du mécanisme
pbdotnetinvoker
- Étape A : Préparer le côté PowerBuilder
- Étape B : Créer l’assembly C# (EventBridge)
- Étape C : Déclencher l’événement et vérifier le retour
- Déploiement & dépendances
- Débogage et pièges fréquents
- Conclusion & bonnes pratiques
1. Pré-requis rapides
Outil | Version min. |
---|---|
PowerBuilder IDE | 2022 R3 build 3391 (pour .NET 8) ou 3356 (pour .NET 6) |
Runtime PB distribué | même build que l’IDE |
SDK .NET x86 | 6.0 ou 8.0 (selon le choix) |
Visual Studio | 2019 (v16.11) ou 2022 (recommandé) |
Important : compile toujours la DLL C# en x86 (ou AnyCPU + Prefer 32-bit).
2. Architecture du mécanisme

- EventBridge appelle
TriggerEvent("objet", "ue_callback", "payload")
. - pbdotnetinvoker relaye l’appel.
- 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
ounet8.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 :
- le message du user-event (« Callback C# ») ;
- 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 dansSystem32
.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 retour | Signification | Action |
---|---|---|
-5 | DotNetObject non instancié | Revoir LoadWithDotNet(Core) et le chemin DLL |
-50 / -51 | Nom d’objet invalide / non trouvé | Vérifier casse + RegisterObject =1 |
-52 | Objet pas enregistré (tables différentes) | Assurer qu’un seul invoker est chargé (pbdotnetinvoker.dll |
BadImageFormat | x64 vs x86 | Recompiler 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#
- Un seul invoker par projet (Framework →
pbdotnetframeworkinvoker
, Core →pbdotnetinvoker
). - x86 partout : PB est 32 bits.
- Toujours désenregistrer l’objet dans
Close
: powerscriptCopierModifiergnv_dotnetmanager.inv_obj.UnregisterObject("w_main")
- Centraliser la gestion .NET dans une NVO singleton simplifie maintenance et débogage.
- 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 :