Chciałbym utworzyć obiekt COM w języku C# i używać go przez IDispatch z JScript. Ta część jest całkiem prosta.Utwórz COM/ActiveXObject w języku C#, użyj języka JScript, z prostym zdarzeniem
Chcę również zaimplementować proste wywołania zwrotne na obiekcie COM, podobne do zdarzenia odsłoniętego przez obiekt XmlHttpRequest, który jest użyteczny w przeglądarce. Model ten pozwala JavaScript, aby dołączyć obsługi zdarzeń tak:
var xmlhttp = new ActiveXObject("MSXML.XMLHTTP");
xmlhttp.onReadyStateChange = function() {
...
};
Chcę, aby mój klient-side kod JScript, aby wyglądać tak:
var myObject = new ActiveXObject("MyObject.ProgId");
myObject.onMyCustomEvent = function(..args here..) {
...
};
Co oznacza kod C# look like? Chciałbym ogólną sprawę - chciałbym móc przekazać argumenty do skryptu JavaScript fn.
Widziałem How can I make an ActiveX control written with C# raise events in JavaScript when clicked?, ale odpowiedzi wyglądają naprawdę skomplikowane do wykonania, i skomplikowane w użyciu.
Od this article, wydaje się, że zdarzenia XMLHttpRequest nie są zdarzeniami COM. onreadystatechange
jest własnością typu IDispatch
. Kiedy klienci skryptu ustawiają tę właściwość na funkcję, JScript marszałkuje ją jako obiekt IDispatch.
Jedyny problem, jaki pozostaje, to wywołanie IDispatch z C#.
To jest połączenie z opóźnieniem, a nie wydarzenie. Użyj atrybutu [ComSourceInterfaces], aby ujawnić zdarzenia .NET. –
Dokładnie. W ogóle nie jest to wydarzenie COM, ale z pewnością jest łatwiejsze do zbudowania i wykorzystania niż okablowanie zdarzeń COM dla tego ograniczonego scenariusza - jednego obiektu i jednego użytkownika tego obiektu. I faktycznie, choć nie jest to wydarzenie COM, programiści poprawnie rozumieją to, aby zaspokoić ich potrzeby "zdarzenia" dla skryptowalnego obiektu. Właśnie dlatego XMLHttpRequest używa podejścia, jak przypuszczam, dla 'onreadystatechange'. To też nie jest "wydarzenie **", ale z pewnością jest rozumiane jako wydarzenie milionów twórców. Specyficzna definicja terminu "zdarzenie" COM nie ma znaczenia dla niektórych celów. – Cheeso
Podczas tworzenia obiektu ActiveXObject w JScript, '' Cheeso.Greet "' pochodzi z 'ProjId', nazwa biblioteki DLL,' Namespace.ClassName' lub zupełnie gdzieś indziej? Bez względu na to, co próbuję, wydaje mi się, że zawsze otrzymuję komunikat "Serwer automatyzacji nie może utworzyć obiektu". –