Vorrei creare un oggetto COM in C# e usarlo tramite IDispatch da JScript. Quella parte è piuttosto semplice.Crea COM/ActiveXObject in C#, utilizza da JScript, con evento semplice
Vorrei anche implementare semplici callback sull'oggetto COM, simile all'evento esposto dall'oggetto XmlHttpRequest che è utilizzabile in un browser. Questo modello consente Javascript per collegare i gestori di eventi come questo:
var xmlhttp = new ActiveXObject("MSXML.XMLHTTP");
xmlhttp.onReadyStateChange = function() {
...
};
voglio che il mio codice JScript sul lato client a guardare come questo:
var myObject = new ActiveXObject("MyObject.ProgId");
myObject.onMyCustomEvent = function(..args here..) {
...
};
Che cosa significa il codice C# assomigliare? Mi piacerebbe il caso generale - mi piacerebbe essere in grado di passare argomenti alla fn di Javascript.
Ho visto How can I make an ActiveX control written with C# raise events in JavaScript when clicked?, ma le risposte ci sembrano davvero complicato da implementare e complicato da usare.
Da this article, sembra che gli eventi XMLHttpRequest non sono eventi COM. Il onreadystatechange
è una proprietà di tipo IDispatch
. Quando i client script impostano tale proprietà su una funzione, JScript esegue il marshalling come un oggetto IDispatch.
L'unico problema che rimane è quello di richiamare l'IDispatch da C#.
Questa è una chiamata in ritardo, non un evento. Utilizzare l'attributo [ComSourceInterfaces] per esporre eventi .NET. –
Esattamente. Non è affatto un evento COM, ma è sicuramente più semplice da costruire e da utilizzare rispetto al cablaggio degli eventi COM per questo scenario limitato: un oggetto e un utente di tale oggetto. E infatti, anche se non è un evento COM, i programmatori lo capiscono correttamente per soddisfare le loro esigenze di "un evento" per un oggetto con script. Questo è il motivo per cui XMLHttpRequest utilizza l'approccio, suppongo, per 'onreadystatechange'. Anche questo è "non ** un evento **", ma certamente è considerato un evento da milioni di sviluppatori. La definizione specifica della COM del termine "evento" è irrilevante per alcuni scopi. – Cheeso
Quando si crea ActiveXObject in JScript, il "" Cheeso.Greet "' deriva da 'ProjId', il nome della DLL,' Namespace.ClassName' o da qualche altra parte? A prescindere da ciò che cerco, sembra sempre che "il server di automazione non sia in grado di creare oggetti". –