Bonjour à toutes et tous,

Pardon d'avance si la terminologie employée est impropre (juriste de profession).

Débutant, je développe à l'aide de visualstudio une petite appli sur la base du navigateur cefsharp de consultations de bases environnementales et de génération de pdf (pour qu'ils soient annexés à des actes notariés électroniques).

Mon Application Winforms (Class Form1) lors d'un évènement javascript onclick appelle une procédure dans une seconde class (Class Bound) qui elle même appelle une procédure de ma form1 (en fait, je désactive un bouton impression d'une page web et j'attribue à ce bouton un évènement javascript onclick à partir duquel je veux lancer une procédure de création d'un fichier PDF (une impression pdf de la page web).

Mon souci est que cette dernière procédure (création d'un pdf) qui est sur Form1 s'exécute non dans le thread principal mais dans le thread de travail de ma procédure d'appel de la seconde class, ce qui provoque des exceptions 'System.NullReferenceException' dans mon appli.

DANS FORM 1

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
Browser = New ChromiumWebBrowser("https://www.geoportail.gouv.fr/carte?c=3.164349169221308,46.82989009658934&z=6&l0=DGAC-PEB_BDD_FXX_WM_WMS::GEOPORTAIL:OGC:WMS(1)&l1=GEOGRAPHICALGRIDSYSTEMS.MAPS.3D::GEOPORTAIL:OGC:WMTS==aggregate(0.2265625)&permalink=yes") With {
        .Dock = DockStyle.Fill
            }
        CefSharpSettings.LegacyJavascriptBindingEnabled = True
        CefSharpSettings.WcfEnabled = True
 
        Dim obj As New BoundObject()
 
        Browser.JavascriptObjectRepository.Register("bound", obj, True, BindingOptions.DefaultBinder)
PUIS L'EVENNEMENT JAVASCRIPT

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
 Private Sub Browser_LoadingStateChanged(sender As Object, e As LoadingStateChangedEventArgs) Handles Browser.LoadingStateChanged
 
            path1 = Application.StartupPath & "\temp\" & utilisateur & "\geoportail01.pdf"
 
            Dim jsScript As String = ""
            jsScript = <js><![CDATA[
document.getElementById('print-comment').disabled=true;
document.getElementById('print-submit').value='Imprimer';
var element = document.getElementById('print-submit');
element.type = "button";
element.onclick = function (){bound.onClicked(window.getSelection().toString());};
]]></js>
 
            Browser.ExecuteScriptAsync(jsScript)
 
(...)
 
 
    End Sub
LE DEBUT DE LA PROCEDURE DE CREATION DU PDF


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
    Public Async Sub PDF_Click()
 
        Dim source As String = Await Browser.GetBrowser().MainFrame.GetSourceAsync()
 
 
        (...)
ENFIN MA CLASS BOUNDOBJECT

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
Public Class BoundObject
    Friend browser As ChromiumWebBrowser
 
    Public Sub OnClicked(ByVal selected As String)
 
        Form1.PDF_Click()
    End Sub
 
End Class
J'ai essayé de lancer Form1.PDF_Click() au moyen d'un délégué sur ma FORM 1 mais rien à faire Form1.PDF_Click() ne s'éxécute pas dans mon thread principal.

Je suis perdu, je ne comprends pas comment procéder pour exécuter Form1.PDF_Click() dans le thread principal si appelé de mon autre class.

Il existe surement une autre méthode pour déclencher une procédure à partir d'un évènement javascript sans passer par une class secondaire ou mais je n'ai pas trouvé/compris dans mes lectures.

Merci pour l'aide que vous pourrez m'apporter.